[UDP套接字在重新连接以太网时写入过期的数据包。以太网断开连接后,如何从套接字刷新写缓冲区?

问题描述 投票:1回答:1

我有一个“传输线程”,用于管理套接字(#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 )均无效,且均未发出信号错误

sockets udp winsock ethernet
1个回答
0
投票

据我所知,问题不在我的软件或本地NIC上。在通过交换机连接到我的LAN上的其他设备之前,我的NIC已连接到以太网集线器。

集线器的存在导致了所描述的行为。没有集线器,我不会遇到任何“刷新”或发送过期数据包的情况。

© www.soinside.com 2019 - 2024. All rights reserved.