【问题标题】:UDP socket problemUDP套接字问题
【发布时间】:2011-01-03 09:55:28
【问题描述】:

我正在编写一个多人游戏(显然使用 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);

【问题讨论】:

  • 还有什么问题?为什么不使用 recvfrom - 这是从 UDP 套接字读取的规范方式?
  • @eli - 因为我不希望它阻塞,因为服务器控制台也必须刷新......

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


【解决方案1】:

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

【讨论】:

  • 引用 winsock 文档:参数 1:nfds - 为了向后兼容而包含
  • 您需要它才能在非 Windows 系统上工作。只有一个套接字,它将是serverSocket + 1
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    嗯...在修改了一下代码后,我发现了以下几行:

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

    所以,它正在接收数据,但控制台上的消息立即被删除。 [叹气]

    【讨论】:

      【解决方案4】:

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

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

      由于您似乎正在使用超时,select() 也可以返回零,即没有套接字描述符准备好,但超时已过期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-21
        • 2021-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多