gpt4 book ai didi

c++ - 为什么关闭 udp 套接字 block ?

转载 作者:可可西里 更新时间:2023-11-01 10:46:06 24 4
gpt4 key购买 nike

我正在为 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'tors 和东西),我正在尝试取消阻止此调用。

为此,我调用了 shutdown(_socket, SD_BOTH) 方法。不幸的是,关闭调用本身 BLOCKS!

在阅读了 MSDN 中的每个可能的页面后,我没有找到任何关于为什么会发生这种情况、解决问题的其他方法或任何解决方法的引用资料。

我检查的另一件事是使用 SO_RCVTIMEO。令人惊讶的是,这个 sockopt 也没有按预期工作。

我的代码/方法有问题吗?

最佳答案

您是否对重复的句柄运行关机?关闭同一句柄将等待此句柄上的任何事件操作完成。

关于c++ - 为什么关闭 udp 套接字 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24752935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com