我正在为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
}
}
现在,当我试图优雅地关闭我的应用程序,而不是网络方式,而是应用程序方式(通过所有的东西),我试图解锁这个调用。
为此,我调用shutdown(_socket, SD_BOTH)
方法。不幸的是,关闭自己的呼叫 BLOCKS !
在阅读MSDN中的每个可能的页面后,我没有找到任何关于为什么会发生这种情况的提法,以及其他攻击问题的方法或任何出路。
我检查的另一件事是使用SO_RCVTIMEO
。令人惊讶的是,这个sockopt也没有按预期工作。
我的代码/方法有问题吗?
答案 0 :(得分:0)
你是否在重复的句柄上运行关机?关闭同一句柄将等待此句柄上的任何活动操作完成。