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

1.我用TCP连接,使用阻塞套接字,用send发送了一个很大的buffer,比如100万字节,在接收端用recv,设置接收缓冲区和发送缓冲区一样大,接收到的还是100万字... 1.我用TCP连接,使用阻塞套接字,用send发送了一个很大的buffer,比如100万字节,在接收端用recv,设置接收缓冲区和发送缓冲区一样大,接收到的还是100万字节。看来并不需要应用程序重组啊,只要设置了和接收端一样大小的buffer就可以通过一次recv调用接收完一次传输的所有数据。这种想法对吗?
2.如果是UDP,在发送端发送了一个很大的buffer,在接收端用同样长度的buffer可以一次接收完所有数据吗?
3.如果是非阻塞套接字又如何呢?
真心求学,请指教!谢谢
展开
 我来答
百度网友0b30379
2009-02-17 · TA获得超过864个赞
知道小有建树答主
回答量:850
采纳率:0%
帮助的人:266万
展开全部
楼上说了点理论,对视对。
从实际效果上说
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。很详细的,看了你就不会问了。
kagezhao
2009-02-15
知道答主
回答量:15
采纳率:0%
帮助的人:20.9万
展开全部
同学,简单来说就是

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

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

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

所以udp一般程序上传输1K~ 1.3K 是个合适的范围。也就是比以太网的MTU小一点。如果你发的数据量比较大,要自己实现乱序重组。

和阻不阻塞没有关系。都一样的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式