Socket问题:用send发数据时, 发送2个字节缓冲区, 会不会分成两次发送,第一次发1个字节,第二次发1个字节 ( 积分: 200 )

  • 主题发起人 主题发起人 golden_future
  • 开始时间 开始时间
G

golden_future

Unregistered / Unconfirmed
GUEST, unregistred user!
send 返回时 实际发送的字节数 可能比要发送的字节数据小.
所以有上面问题
 
send 返回时 实际发送的字节数 可能比要发送的字节数据小.
所以有上面问题
 
一个一个的包。。我觉得有可能!
 
可能发现,所以你在发送数据的时候,在加个头与尾的标识,如果没有头和尾,刚把当前数据保存起来,
while 没头没尾 do
在接收,在判断.....
 
据我所理解,根据OSI模型,数据包并不会在应用层进行分割.Send发送数据如果实际发送的字节数少于要发送的数据数,send函数本身不会自动调用一次send进行第二次发送.假如你发送一个1024K的数据包,但是传输层的最大传输单元只有1K,那么send依然能发送成功,只是数据包会在传输层被分成1024个包了.
数据包分段控制是根据网络(传输层)的最大传输单元来控制的,而对应用层不会处理.你的误解可能由此产生.
 
一般情况send函数只要调用成功都会将缓冲区的所有指定的数据发送完的.所以没必要进行另外的控制校验.
 
to zfg886
问题没表示清, 我想说的是会不会出现以下情总;
用send发数据时, 发送2个字节缓冲区, send返回时我们发现返回值为1, 这说明只发送1个字节, 所以我们不得不再调用send发送1次, 将剩余的1字节发出.

如果缓冲区很大, 如5M, 那还有可能send 返回时没有将缓冲区的全部分发出.
我问的是, 如果缓冲区很小,小到什么程度时,send 能够将缓冲区的内容一次发完.

我想应该有一个最小发送单位, 比如说缓冲区小于等于 512字节, send都能一次缓冲区全部分发完, 这个最小单位是多少?
如果我上面假设成立的话,那么我看到的很多代码都是有问题的啊,
 
你判断一下Send的返回值
如果是缓冲区已经满的情况
那一个字节也不会发出去
 
to Mike1234567890
缓冲区已经满的情况,那一个字节也不会发出. 这个好理解.

那缓冲区没满时, 会发出几个字节呢? 是两个字节都发出去那,还是只发出一个啊,
send 能发送出去的最小长度由什么决定, 由下层协议决定,还时由系统缓冲区大小决定,
如果由系统缓冲区大小决定, 系统缓冲区最小剩余空间会为一个字节不会?
 
单个TCP包的数据部分最长似乎是1460, 小于这个数值的话 send 一般应该能够一次发出,但是由于缓冲区的问题还是有可能不能全部发出
 
由缓冲区大小决定.但不排除受其它意外因素影响的可能(最起码我一次发一个4M的数据的时候,是一次出去了.只是发多了ADSL断流了)
我想理论上系统为缓冲区分配空间时,可能为出现只有1个字节的情况.不过绝对不会缓冲区要求两个字节,系统因为没有空间了,就给他分配一个字节的空间算了.

如果理论上的这个情况用于实际,系统只怕早就崩溃了.
 
utop,TCP包的数据长度只会在传输层依据最大传输单元进行分割,并不会在SEND时就由协议分割.这是肯定的.况且,由于网络上每个路由设备的不同,数据包最大长度并没有统一限制.而是由其实际设备来决定.
 
MSDN:
If no error occurs, send returns the total number of bytes sent, which can be less than the number indicated by len for nonblocking sockets. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.

TCP 协议本身对数据包的最大长度是有限制的。
 
如果你用传统的SERVERSOCKET和CLIENTSOCKET,所有发送都必须检验返回参数,循环控制发,即便是本机内部传送也一样......直接用INDY吧,省事又稳定,但服务器用效率不高
 
后退
顶部