LoveUnix » 编程开发 & Rational » 请教个socket通讯的问题
让LU留住您的每

一天 让LU博客留住您的每一天
2005-7-1 11:17 sccjh
服务程序:<br /><br />socket(...);<br /><br />...<br /><br />bind(....);<br /><br />...<br /><br />accept(...);<br /><br />...<br /><br />while(1)<br /><br />{<br /><br />   ...<br /><br />  recv(...);<br /><br />  ...<br /><br />}<br /><br />....<br /><br />当从客户端用send()发送2300个字节内容时,在服务端有时一次性能收到,有时要分成二次才能收完,而且第一次总是收1448个,而SO_SNDBUF、SO_RCVBUF都很大,实在不明白是怎么控制接收长度的,请求各位指点指点啊,谢谢谢谢&#33;&#33;&#33;<br /><br />

2005-7-1 12:00 无双
以太网包最大长度是1500 所以会分包<br /><br />任何传送的包都受限于传输层能传送的包的最大大小

2005-7-1 16:11 sccjh
谢谢,那为什么有时候又能一次性收到了?

2005-7-1 16:29 无双
不懂 不过我开发时从来不指望能一次收完 或是一次正好收到一个包<br /><br />PS 向127.0.0.1发与向你的本机ip发效果是不一样的

2005-7-1 16:31 无双
还有可能是ip层进行了重组<br /><br />虽然ip进行分包<br /><br />但是如果你一直不读 那后面收到ip包会与前面的ip包重组成一个大包(如果你发送时也是发一个大包的话)<br /><br />这个可以自己试试看吧<br /><br />我没有验证

2005-7-1 20:38 kj501
如果是以太网,传输2300个字节的内容肯定要分包的。用tcpdump把包抓下来看看就知道了。

2005-7-2 13:34 sccjh
谢谢kj501、无双大侠,本来我发现要分包,程序中就多次接收,但老总问我为什么,我答不出来 <!--emo&:blush:--><img src='style_emoticons/default/blush.gif' border='0' style='vertical-align:middle' alt='blush.gif' /><!--endemo-->

2005-7-2 23:09 无双
你就说 tcp是流式的<br /><br />不会发一个包 对方就对应的接收到一个同样大小内容的包<br /><br />这是最基本的知识了

2005-7-3 10:22 kj501
<!--QuoteBegin-sccjh+2005-07-02 13:34:16--><div class='quotetop'>QUOTE(sccjh @ 2005-07-02 13:34:16)</div><div class='quotemain'><!--QuoteEBegin-->谢谢kj501、无双大侠,本来我发现要分包,程序中就多次接收,但老总问我为什么,我答不出来 <!--emo&:blush:--><img src='style_emoticons/default/blush.gif' border='0' style='vertical-align:middle' alt='blush.gif' /><!--endemo--><br />[right][snapback]476172[/snapback][/right]<br /><!--QuoteEnd--></div><!--QuoteEEnd--><br />数据链路层有一个最大传输单元(MTU)的限制。计算机网络方面的教科书都有介绍。

2005-7-7 17:37 zhubob
接收和发送的接口协议最好要先定义好<br />一般应有个同步头,我个人习惯上采用8个字节来作为同步头,同步头的内容为该次发送字节的长度,这样接受的时候首先读把前8个字节截取出来,如果少于8个字节继续等待直到8个字节为止,当收到8个字节后,根据8个字节的内容来读取后面的包信息,如果不够同步头的内容长度则读完之后等待,如果超过8个字节内容里面的长度则截掉多余的信息不要。这样不断多次读包不会丢失,而且对网络丢包的情况也能起到比较好的控制,当然自己可以根据通信量的情况自己定义同步头的大小

2005-7-21 07:43 sccjh
再次谢谢kj501、无双,还有zhubob大侠

页: [1]
查看完整版本: 请教个socket通讯的问题


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.