不管是阻塞还是非阻塞模式,send(...)返回的数据长度,只是表示拷贝到协议栈缓冲区中的数据长度,并不是实际发送的数据量或对方接收的数据量。对于recv(...),只是从缓冲区中获取接收到的数据。发送方先将数据拷贝到协议栈缓冲区,tcp会保证缓冲区中的数据发送到接收方的缓冲区。至于数据如何可靠的到达,底层协议已经给我们做了很多工作,上层的应用程序不用考虑。
阻塞与非阻塞,相对于底层协议来说没有太大的区别(我现在是这么认为的),如果是阻塞模式,send的时候会将要发送的数据拷贝到缓冲区中,如果缓冲区的容量无法容纳要发送的数据,就等待缓冲区中的数据发送,直到缓冲区可以容纳数据为止,然后方法返回。而非阻塞模式,如果缓冲区的容量无法容纳要发送的数据,它先把缓冲区真满,直接返回填入到缓冲区中的数据长度。
一些不错的文章:
Linux下面socket编程的非阻塞TCP研究
关于socket阻塞与非阻塞情况下的recv、seng、read、write返回值问题
socket阻塞和非阻塞的区别