请问网络编程中send 和 recv缓冲区的问题

来源:百度知道 编辑:UC知道 时间:2024/07/06 16:12:02
1.我用TCP连接,使用阻塞套接字,用send发送了一个很大的buffer,比如100万字节,在接收端用recv,设置接收缓冲区和发送缓冲区一样大,接收到的还是100万字节。看来并不需要应用程序重组啊,只要设置了和接收端一样大小的buffer就可以通过一次recv调用接收完一次传输的所有数据。这种想法对吗?
2.如果是UDP,在发送端发送了一个很大的buffer,在接收端用同样长度的buffer可以一次接收完所有数据吗?
3.如果是非阻塞套接字又如何呢?
真心求学,请指教!谢谢

楼上说了点理论,对视对。
从实际效果上说
1:你说的这种现象,我估计是发到127.0.0.1的。发到公网上实际是要多次接收的。不过你可以指定MSG_WAITALL,那么对于阻塞socket,它会阻塞住,知道完整的填满100万字节才返回。
2:不能的,100万字节远远大于udp一般的最大传输长度,超过部分会丢失。
3:非阻塞套接字和1差不多。所部同的是,假如调用recv时,系统一个字节也没收到,返回SOCKET_ERROR,调用WSAGetLastError可以得到WSAEWOULDBLOCK。

搂住应该自己去看看msdn,仔细研究研究。假如英语不行就没办法了。这种msdn都是英语跟我差不多差劲的都看得懂的。
recv:http://msdn.microsoft.com/en-us/library/ms740121(VS.85).aspx
send:http://msdn.microsoft.com/en-us/library/ms740149(VS.85).aspx
再去看看WSAAsyncSelect,select,WSAEventSelect。很详细的,看了你就不会问了。

同学,简单来说就是

TCP没有包的概念,是流式的。你一次不论发了多少字节过去,对方可能是分n次顺序收到的。

UDP 是基于包的。一次发多少字节,对方也收多少字节。但数据包到达顺序可能是乱序的。

另外一个udp包的最大长度是有限的,只有接近64K.
实际上在internet上这么大的包传输极容易丢失,因为在ip层会切割为小片段传输,一旦丢了一个小片段就会全都丢失,因为udp没有自动重传嘛。