gpt4 book ai didi

c++ - 阻塞的 send() 会立即返回吗?

转载 作者:行者123 更新时间:2023-11-28 02:31:49 25 4
gpt4 key购买 nike

我认为在阻塞套接字上调用 send() 直到发送完所有数据(直到最后一 block 数据被发送到发送缓冲区)才会返回,但是下面的测试否则显示:

// buffer = "AAAAAAAA...B" (10 MB)
char *buffer = new char[10485760];
memset(buffer, 0x41, 10485760);
buffer[10485758] = 0x42;
buffer[10485759] = '\0';

// Send buffer
send(s, buffer, 10485760, 0) ;

printf("send() has returned");

所以基本上我连接到 Netcat 并发送了 buffer,甚至在 send() 返回后,AAAAAAAAAAAAAA... 仍在显示到另一端的控制台。您可以随时关闭发送器,发送将停止(所以不是 buffer 已经到达另一端,而是需要很长时间才能显示到控制台)。

这只有在发送缓冲区超过 10 MB 时才有意义。

编辑:send() 的返回值为10485760(即缓冲区 大小)。

最佳答案

send 将数据发送到内核,并将其放置在套接字缓冲区中。如果内核用完套接字缓冲区,send 将阻塞(或者失败,如果它是非阻塞的)。

这与内核向网络发送数据几乎没有关系。

但是,如果您终止一个程序,它的所有套接字都会被强制关闭,这将丢弃内核缓冲区中所有未发送的数据。

关于c++ - 阻塞的 send() 会立即返回吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28777708/

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