如果我向我的套接字服务器发送大量数据包,它们将被收集在内部接收套接字缓冲区中。
当停止发送源并重新启动服务器时,之前发送的数据包被一一消耗。
是否有可能以某种方式重置内部套接字缓冲区。
我正在使用 UDP 套接字,代码是在 Windows 上用 C++ 编写的。
你的问题不清楚。如果您关闭套接字并创建一个新套接字,您将获得一个全新的套接字接收缓冲区,其中没有任何内容,而不是来自旧套接字的旧套接字缓冲区及其旧的待处理数据。但是,当您绑定新套接字时,数据包可能仍在传输中,因此它们会立即出现在新的接收缓冲区中。对此你无能为力,也无能为力,这是正确的。
要么你对应用程序做错了什么,要么你为你的应用程序选择了错误的协议(在这种情况下是 UDP)。
UDP 不提供任何消息顺序或传递的保证。因此,很自然地,当您在同一端口上重新启动服务器时,您会读取旧数据。
我认为使用 TCP 您可以通过将 SO_LINGER 选项设置为 0 并设置 SO_REUSEADDRESS 以避免 TIME_WAIT 状态来避免这种情况。
不幸的是,由于 UDP 没有“连接”的概念,操作系统(或您)无法区分“旧”数据和“新”数据。
特别是在 Win32 上,有一个SIO_FLUSH
ioctl 可以传递给WSAIoctl()
. 这个我没试过,好像只和发送队列有关。
另请参阅:清理窗口套接字内部缓冲区