立即阻塞 send() returns 吗?
Does a blocking send() returns immediately?
我认为在阻塞套接字上调用 send()
不会 return 直到所有数据都被发送(直到最后一个数据块被发送到发送缓冲区),但是下面测试显示否则:
// buffer = "AAAAAAAA...B" (10 MB)
char *buffer = new char[10485760];
memset(buffer, 0x41, 10485760);
buffer[10485758] = 0x42;
buffer[10485759] = '[=11=]';
// Send buffer
send(s, buffer, 10485760, 0) ;
printf("send() has returned");
所以基本上我连接到 Netcat 并发送 buffer
,甚至在 send()
已经 returned 之后,AAAAAAAAAAAAAA...
仍然显示在另一台控制台上结尾。您可以随时关闭发送器,发送将停止(所以不是buffer
已经到达另一端,而是需要很长时间才能显示到控制台)。
这只有在发送缓冲区超过 10 MB 时才有意义。
编辑: send()
的 return 值为 10485760
(即 buffer
大小)。
send
将数据发送到内核,并将其放置在套接字缓冲区中。如果内核用完套接字缓冲区,send
将阻塞(或失败,如果它是非阻塞的)。
这与内核向网络发送数据关系不大。
但是,如果您终止一个程序,它的所有套接字都会被强制关闭,这将丢弃内核缓冲区中所有未发送的数据。
我认为在阻塞套接字上调用 send()
不会 return 直到所有数据都被发送(直到最后一个数据块被发送到发送缓冲区),但是下面测试显示否则:
// buffer = "AAAAAAAA...B" (10 MB)
char *buffer = new char[10485760];
memset(buffer, 0x41, 10485760);
buffer[10485758] = 0x42;
buffer[10485759] = '[=11=]';
// Send buffer
send(s, buffer, 10485760, 0) ;
printf("send() has returned");
所以基本上我连接到 Netcat 并发送 buffer
,甚至在 send()
已经 returned 之后,AAAAAAAAAAAAAA...
仍然显示在另一台控制台上结尾。您可以随时关闭发送器,发送将停止(所以不是buffer
已经到达另一端,而是需要很长时间才能显示到控制台)。
这只有在发送缓冲区超过 10 MB 时才有意义。
编辑: send()
的 return 值为 10485760
(即 buffer
大小)。
send
将数据发送到内核,并将其放置在套接字缓冲区中。如果内核用完套接字缓冲区,send
将阻塞(或失败,如果它是非阻塞的)。
这与内核向网络发送数据关系不大。
但是,如果您终止一个程序,它的所有套接字都会被强制关闭,这将丢弃内核缓冲区中所有未发送的数据。