我有一个“传输线程”,用于管理套接字(#include WinSock2.h)以传输我的应用程序所需的所有UDP数据。该应用程序是在Windows 10上运行的c ++ Windows应用程序。我每秒最多向子网广播地址发送5个左右的数据包,每个数据包少于200个字节。
问题是,当我断开以太网连接时,套接字的写缓冲区中似乎有一些未发送的数据,这比我无法清除的要多。
当我的应用程序检测到以太网丢失时,我关闭(closesocket)并重新打开套接字。重新连接后,套接字立即发送一些旧的消息,这些消息在断开以太网连接时被“发送”。
我认为此问题不在我的应用程序范围内。我在应用程序运行时断开了以太网连接,然后关闭了该应用程序。重新连接后,尽管应用程序不再运行,但我立即看到一些消息被传输。
我尝试过的事情(没有运气):
我已经尝试在shutdown( m_sock, SD_BOTH );
之前立即致电closesocket( m_sock );
我尝试在关闭前立即向套接字写入一个充满零的缓冲区
我无法设置SO_DONTLINGER
选项,因为我的套接字是SOCK_DGRAM
[当我尝试WSAIoctl( m_sock, SIO_FLUSH, NULL, 0, NULL, 0, &dwBytesRead, &wsol, NULL )
时返回错误997(WSA_IO_PENDING)
我不知道如何停止待处理的IO。
WSASendDisconnect( m_sock, NULL )
或CancelIo( (HANDLE)m_sock )
均无效,且均未发出信号错误
据我所知,问题不在我的软件或本地NIC上。在通过交换机连接到我的LAN上的其他设备之前,我的NIC已连接到以太网集线器。
集线器的存在导致了所描述的行为。没有集线器,我不会遇到任何“刷新”或发送过期数据包的情况。