2012-04-30 53 views
0

我的作業是編寫函數,讓客戶端到服務器延遲估計。 我需要從客戶端發送50個「什麼時候?」的請求。而不是從服務器接收50個響應(通過getTickCount()) - 而不是計算平均值。 問題是,由於某種原因,第二個recv函數崩潰,我不知道爲什麼。 這是我的代碼部分(從我的客戶):客戶端到服務器延遲估計 - 通過UDP

WSAData wsaData; 
if (NO_ERROR != WSAStartup(MAKEWORD(2,2), &wsaData)) 
{ 
    cout<<"Time Client: Error at WSAStartup()\n"; 
} 
SOCKET connSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
if (INVALID_SOCKET == connSocket) 
{ 
    cout<<"Time Client: Error at socket(): "<<WSAGetLastError()<<endl; 
    WSACleanup(); 
    return; 
} 

sockaddr_in server; 
sockaddr serverr; 
int server_len = sizeof(server); 
server.sin_family = AF_INET; 
server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
server.sin_port = htons(TIME_PORT); 

int bytesSent = 0; 
int bytesRecv = 0; 
string sendBuff; 
char recvBuff[255]; 

     for (i=0 ; i<50;++i) 
    { 
     bytesSent = sendto(connSocket,sendBuff.c_str() , (int)strlen(sendBuff.c_str()), 0, (const sockaddr *)&server, sizeof(server)); 
     if (SOCKET_ERROR == bytesSent) 
     { 
      cout<<"Time Client: Error at sendto(): "<<WSAGetLastError()<<endl; 
      closesocket(connSocket); 
      WSACleanup(); 
      return; 
     } 
    } 
    for (i=0 ; i<50;++i) 
    { 
     bytesRecv = recv(connSocket, recvBuff, 255, 0); 
     if (SOCKET_ERROR == bytesRecv) 
     { 
      cout<<"Time Client: Error at recv(): "<<WSAGetLastError()<<endl; 
      closesocket(connSocket); 
      WSACleanup(); 
      return; 
     } 
+0

我們可以假設評論中的「100」是一個錯字嗎? –

+0

我們錯過了很多上下文。如果你能提供一個簡短的,完整的程序,那將是最好的。請參閱http://sscce.org/。否則,你的意思是「墜毀」?連接是TCP還是UDP? 'bytesSent'和'bytesRecv'在resp之後有什麼值。系統調用?如何聲明'recvBuff'? –

+1

你不應該使用'recvfrom()'?這是UDP的權利? – noMAD

回答

0

你試過切換給recvfrom?由於您使用sendto,因此其鏡像功能應該更有意義。

另外,如果您在處理單個接收前發送了50個請求,那麼您的延遲將不會太好。您的平均值應計算在多個單一發送/接收對上

+0

基本上,我的老師給了我們一個關於UDP的客戶端和服務器的簡單例子,所以我遵循他的代碼,並且我的其他所有函數都能很好地處理recv。無論如何,我試圖使用rcvform,但我得到同樣的問題。 不,我看到我也有異常 - 在comex3.exe 0x757b6aff第一次機會異常:0x40010005:Control-C。 這是什麼意思? – Nusha