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

  • 服务器udp套接字绑定到0.0.0.0:8854 .

  • 服务器udp套接字具有IP_PKTINFO = true .

  • 服务器udp套接字有SO_REUSEADDR = true .

  • server udp socket启动重叠的WSARecvMsg操作 .

  • client绑定到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需要设置的标志,但我似乎无法找到它 . 我尝试使用谷歌搜索各种搜索术语,但已经碰壁了 .

任何和所有的帮助将不胜感激 . 谢谢 .