UDP套接字问题

时间:2010-01-10 04:40:32

标签: c++ sockets udp winsock client-server

我正在编写一个多人游戏(显然是使用UDP套接字。注意:使用winsock 2.2)。服务器代码的内容如下:

while(run)
{
    select(0, &readSockets, NULL, NULL, &t)
    if(FD_ISSET(serverSocket, &readSockets))
    {
        printf("%s\n","Data receieved");
        //recvfrom over here
    }
    FD_SET(serverSocket, &readSockets);
}

虽然这不是从我的客户端接收数据,但这是:

recvfrom(serverSocket, buffer, sizeof(buffer), 0, &client, &client_size);

4 个答案:

答案 0 :(得分:1)

这里可能存在的一个问题是select()电话。我相信第一个参数需要是最高的套接字数+1。

答案 1 :(得分:1)

FD_SET位于循环的末尾,因此您对select()的第一次调用看起来可能是空的或未初始化的fd_set。确保在循环之前使用FD_ZERO(&readSockets)FD_SET(serverSocket, &readSockets)。最好检查select()电话上的错误。

答案 2 :(得分:0)

嗯...在摆弄一下代码之后,我发现了这些行:

console->clear();
console->resetCursorPosition();

因此, 接收数据,但控制台上的消息立即被删除。 [叹息]

答案 3 :(得分:0)

您应该检查select()返回的错误。在Windows上,这将是:

if (( nret = select( nfds, &rset, &wset, &eset, &to )) == SOCKET_ERROR )
{
   // error handling, probably with WSAGetLastError()
   // ...
}

由于看起来你正在使用超时,select()也可以返回零,即没有套接字描述符准备就绪,但超时已过期。