客户端到服务器的延迟估计 - 通过UDP

时间:2012-04-30 19:05:43

标签: c++ sockets

我的作业是编写让客户端进行服务器延迟估计的功能。 我需要从客户端50发送“什么是时间?”的请求。而不是从服务器接收50个响应(通过getTickCount()) - 而不是计算平均值。   问题是,由于某种原因,第二个recv功能崩溃,我不知道为什么。 这是我的代码的一部分(来自我的客户):

    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;
        }

2 个答案:

答案 0 :(得分:0)

您是否尝试过切换到recvfrom?由于你使用的是sendto,它的镜像功能应该更有意义。

另外,如果您在处理单次接收之前发送了50个请求,那么您的延迟将不会有任何好处。您的平均值应该在多个单个发送/接收对上计算

答案 1 :(得分:-1)

定义两个整数变量(开始,结束) 处理从服务器发送的消息的for循环中的错误后,添加此代码

            recvBuff[bytesRecv] = '\0'; //for handling null terminated to the answer

            if (i == 0)
            {
                start = atoi(recvBuff);
            }
            if(i == 50){
            end = atoi(recvBuff);
            }


        cout << endl << "Time Client: Delay Estimation:       " << (end - start) / 50<< " ms " << endl;