为什么关闭udp套接字块
why shutdown on udp socket blocks?
我正在为windows桌面/服务器编写UDP服务器应用程序。
我的代码使用windows建议的WSA API如下方式(这是我简化的receivePacket
方法):
struct Packet
{
unsigned int size;
char buffer[MAX_SIZE(1024)];
}
bool receivePacket(Packet packet)
{
WSABUFFER wsa_buffer[2];
wsa_buffer[0].buf = &packet.size;
wsa_buffer[0].len = sizeof(packet.size);
wsa_buffer[1].buf = packet.buffer;
wsa_buffer[1].len = MAX_SIZE;
bool retval = false;
int flags = 0;
int recv_bytes = 0;
inet_addr client_addr;
int client_addr_len = sizeof(client_addr);
if(WSARecvFrom(_socket, wsa_buffer, sizeof(wsa_buffer)/sizeof(wsa_buffer[0]), &bytes_recv, &flags, (sockaddr *)&client_addr, &client_addr_len, NULL, NULL) == 0)
{
//Packet received successfully
}
else
{
//Report
}
}
现在,当我试图优雅地关闭我的应用程序时,不是网络明智的,而是应用程序明智的(通过所有的d'tor和东西),我试图解锁这个调用。
为此,我调用shutdown(_socket, SD_BOTH)
方法。不幸的是,对shutdown本身的调用会阻塞!
在阅读了MSDN中可能的每一页后,我没有找到任何关于为什么会发生这种情况的参考,其他解决问题的方法或任何出路。
我检查的另一件事是使用SO_RCVTIMEO
。令人惊讶的是,这个sockopt并没有像预期的那样工作。
我的代码/方法有什么问题吗?
是否对重复句柄运行了shutdown ?在同一句柄上的关闭将等待该句柄上的任何活动操作完成。
相关文章:
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- 具有使用 UDP 套接字字节的限制的标头
- 在 Linux 中关闭 UDP 套接字后,recv 不会返回
- 使用单个套接字处理多个传入的 UDP 连接
- 如何在C++中创建特定大小的消息以通过UDP套接字发送?
- 如何在 LAN 上查找带有套接字 (UDP) 的服务器 C++.
- 连接UDP套接字,但仍然接收来自其他源的数据报
- UDP 套接字读取最后一个传入字节
- UDP 套接字 select() 在某些情况下无延迟(超时)返回 1
- 通过 c++ 中的 udp 套接字将派生类对象从一个进程发送到另一个进程
- FFmpeg:解码从UDP套接字接收的AVPackets
- 在环路中使用 UDP 套接字时连接被拒绝
- 如何在 Linux 上的 C/C++ 中使用 ipv6 udp 套接字进行多播?
- 套接字 UDP - 程序在接收处停止
- 为什么在此 UDP 客户端/服务器示例中没有必要绑定客户端套接字?
- 使用 boost::asio 获取 UDP 套接字远程地址
- 如何使用 boost asio 通过 UDP 套接字发送无符号字符的 std::vector?
- 发送有关 C 和 C++ 中的 UDP 套接字的信息