내가 지금 아주 잘 작동 스카이프와 같은 약간의 VoIP 응용 프로그램을 쓰고 있어요,하지만 난 아주 이상한 문제로 실행했습니다. 이상한 윈속 RECV() 둔화
은 하나 개의 스레드에서, 나는 소켓에서 데이터를 가져 오기 위해 실행에 두 번 잠시 동안 (사실) 루프 내에서 윈속 RECV() 함수를 호출하고 있습니다. | [2 바이트 헤더 :전체 메시지 : 첫 번째 호출은 두 번째 호출과 같은 메시지의 나머지를 얻는 동안 (짧은)에 주조됩니다 2 바이트를 가져옵니다 메시지, 길이는 2Byte Header에 의해 결정됨]
이 패킷들은 대략 초당 4900 바이트이며, 약 3000 바이트/초의 라운드입니다.
이들 패킷의 콘텐츠는 웨이브로 변환 도착 오디오 데이터이다. ioctlsocket()
와
내가 소켓 여부를 각 "메시지"에서 일부 데이터가 어떠했는지를 결정 나는 (2 바이트 + 데이터)가 나타납니다. 스레드의 while(true) loop
내에 메시지를받은 직후에 소켓에 뭔가가 있으면 메시지가 수신되지만 대기 시간을 상향 조정하지 못하게됩니다.
이 개념은 아주 잘 작동하지만, 문제는 여기에있다 :
내 VOIP 프로그램이 실행되는 동안 나는 평행 파일을 (예를 통해 브라우저를) 다운로드 할 때, 항상 있기 때문에, 소켓에 쌓인 너무 많은 데이터가 도착 다운로드하는 동안recv() loop
은 실제로 속도가 느려집니다. 이것은 실제 voip up/download 이외의 모든 다운로드/업로드 상황에서 발생합니다.
이 문제가 어디에서 오는지 모르겠어요,하지만 실제로 내 응용 프로그램의 VoIP 트래픽 이외의 모든 업/다운로드를 취소 할 때, 내 응용 프로그램을 다시 완벽하게 작동합니다.
프로그램이 완벽하게 실행하는 경우
는ioctlsocket()
기능은 기능에서 제공받을 경우 클래스 내에서 정의의 bytesLeft의 VAR에 0을 기록합니다.
어디에서 왔는지 알고 있습니까? 아래 수신 기능을 첨부하겠습니다 :
std::string D_SOCKETS::receive_message(){
recv(ClientSocket,(char*)&val,sizeof(val),MSG_WAITALL);
receivedBytes = recv(ClientSocket,buffer,val,MSG_WAITALL);
if (receivedBytes != val){
printf("SHORT: %d PAKET: %d ERROR: %d",val,receivedBytes,WSAGetLastError());
exit(128);
}
ioctlsocket(ClientSocket,FIONREAD,&bytesLeft);
cout<<"Bytes left on the Socket:"<<bytesLeft<<endl;
if(bytesLeft>20)
{
// message gets received, but ignored/thrown away to throw away
return std::string();
}
else
return std::string(buffer,receivedBytes);}
VOIP 프로그램과 다른 프로그램이 둘 다 동일한 대역폭을 공유하고 있다고 가정하면 다른 프로그램에서 큰 다운로드를하면 프로그램의 데이터 수신 속도가 다소 느려지는 것을 기대할 수 없습니까? 특히 TCP를 사용하고 있으며 대역폭 경합으로 인해 스트림의 TCP 패킷 중 하나가 삭제되는 경우 ... 보낸 사람이 다시 보내야하며 그 동안에는 응용 프로그램에서 더 이상 데이터가 수신되지 않습니다. 또한 TCP는 혼잡을 피하기 위해 자동 전송 속도 스로틀 링을 수행하므로 요인이 될 수도 있습니다. VoIP의 경우 UDP를 사용하는 것이 더 낫습니다 ... –