我正在编写一个多人游戏(显然是使用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);
答案 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()
也可以返回零,即没有套接字描述符准备就绪,但超时已过期。