winsock udp连接丢失或丢弃的数据包

时间:2015-09-23 01:20:00

标签: c++ sockets udp connect winsock

我正在向thekogans stream库添加客户端/服务器UDP支持,并在Windows上遇到问题。这就是我在做的事情;

  • server udp socket绑定到0.0.0.0:8854。
  • 服务器udp套接字具有IP_PKTINFO = true。
  • 服务器udp套接字有SO_REUSEADDR = true。
  • server udp socket启动重叠的WSARecvMsg操作。
  • 客户端绑定到0.0.0.0:0并连接到127.0.0.1:8854。
  • 客户端使用WSASend发送消息。
  • 服务器套接字接收消息并创建一个具有以下属性的新UDP套接字:

    • SO_REUSEADDR = true
    • 绑定到IP_PKTINFO(127.0.0.1:8854)返回的地址。
    • 连接到WSARecvMsg返回的任何地址。
  • 客户端和新服务器UDP套接字交换一堆消息(使用WSASend和WSARecv)。

以下是我看到的行为:

  • 客户端和服务器之间的第一个连接完美无瑕。
  • 然后我让客户端退出并重启。
  • 来自客户端的所有其他数据包都将被删除。
  • 如果我在新服务器UDP套接字(127.0.0.1:8854)上设置超时并且超时并关闭,则客户端可以再次连接。换句话说,该计划似乎有效但一次只有一个客户。如果服务器具有为同一端口创建的具体(非通配符)套接字,则没有其他客户端可以向其发送消息。

可能有用的更多信息:服务器是异步的并使用IOCP。这段代码(使用epoll和kqueue)在Linux和OS X上完美运行。我觉得我在某个地方缺少一些winsock需要设置的标志,但我似乎无法找到它。我尝试使用谷歌搜索各种搜索词,但已经碰壁了。

非常感谢任何和所有帮助。谢谢。

0 个答案:

没有答案