gpt4 book ai didi

c++ - 为什么多次写入套接字时,它会阻塞?

转载 作者:太空宇宙 更新时间:2023-11-04 06:44:45 24 4
gpt4 key购买 nike

我遇到了套接字问题,如果你能帮忙我会很高兴......
问题是当我多次发送数据时它会阻塞,例如:

//--- client ---  
//..
send(sock, buf_1, sizeof(buf_1), 0);

for (x10){
//...
send(sock, buf_2, sizeof(buf_2), 0);
if (recv(sock, buf_2, sizeof(buf_2), 0)<0) printf("recv_2() failed");
//...
}

for (x20){
//...
send(sock, buf_3, sizeof(buf_3), 0);
if (recv(sock, buf_3, sizeof(buf_3), 0)<0) printf("recv_3() failed");
//...
}
//...

//--- server---
//...
if (recv(sock, buf_1, sizeof(buf_1), 0)<0) printf("recv_1() failed");

for (x10){
if (recv(sock, buf_2, sizeof(buf_2), 0)<0) printf("recv_2() failed");
//...
send(sock, buf_2, sizeof(buf_2), 0);
}

for (x20){
if (recv(sock, buf_3, sizeof(buf_3), 0)<0) printf("recv_3() failed");
//...
send(sock, buf_3, sizeof(buf_3), 0);
}
//...

第一个 send() 之后的交换 block ,有什么想法吗?
udp 是否也支持多个 sendto()

感谢您的回答-

最佳答案

在这种情况下,发送和接收都是阻塞的。您需要在套接字上设置异步标志(我认为是 O_NONBLOCK - 请参阅 fnctl 的文档)。但这可能很难做到正确。如果您不发送/获取所有数据,则必须继续调用 send/recv 直到您获得所有数据,有效地执行此操作意味着您将不得不在套接字上使用 select 系统调用。

现在这一切都非常可行,但调试起来并没有太多乐趣和痛苦。我建议您尝试使用 boost::asio(异步 io)库,而不是使用原始套接字。 http://www.boost.org/doc/libs/1_41_0/doc/html/boost_asio.html

关于c++ - 为什么多次写入套接字时,它会阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2039780/

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