Chinaunix

标题: sendto [打印本页]

作者: marco_hxj    时间: 2009-02-24 21:31
标题: sendto
sendto返回实际发送的长度,

那比如我想发送10个字节,
n=sendto(......,.......,10,....);
if(n>0 && n!= 10)
{
      sendto(......,......,10-n,....);//假设到第2次,10字节发送完成
}

这样的话,接收端调用recvfrom的时候是 分2次收到n字节和10-n字节 还是 一次收到10个字节?
作者: cobras    时间: 2009-02-24 21:42
这需要区分TCP和UDP。UDP不能分开发。TCP分开发和一起发对用户而言没有区别
作者: dreamice    时间: 2009-02-24 21:58
标题: 回复 #1 marco_hxj 的帖子
UDP应该就是两次接收到了,TCP的话,不太清楚了,需要验证一下了。
作者: marco_hxj    时间: 2009-02-24 22:05
分两次收到的话,分析协议启不是很痛苦,需要1个字节1个字节去判断数据。
作者: alexhappy    时间: 2009-02-25 10:17
sendto函数跟send函数工作原理是一样的么?不解。。。。请高人指点
作者: hellioncu    时间: 2009-02-25 10:26
UDP的话一次sendto就可以了,要么没发成功,要么全部发成功
作者: alexhappy    时间: 2009-02-25 10:33
原帖由 hellioncu 于 2009-2-25 10:26 发表
UDP的话一次sendto就可以了,要么没发成功,要么全部发成功

你的意思是你sendto一次,数据就会发送一次?而不是仅仅拷贝到发送缓冲区
或者说sendto没有发送缓冲区的这个概念?
作者: hellioncu    时间: 2009-02-25 10:45
原帖由 alexhappy 于 2009-2-25 10:33 发表

你的意思是你sendto一次,数据就会发送一次?而不是仅仅拷贝到发送缓冲区
或者说sendto没有发送缓冲区的这个概念?


我说的成功是对sendto来说的,sendto成功不表示一定能发出去
作者: alexhappy    时间: 2009-02-25 11:04
我想这取决于socket是否是连接的,如果是连接模式下的话,sendto和send的行为一样,在非连接模式下,每sendto一次并且返回成功的话应该就会发送一次(但并不代表会发送成功)

PS:LZ,你试验结果出来了没?
作者: pagx    时间: 2009-02-25 13:35
如果是UDP的话, 对方可能一次都收不到。
作者: marco_hxj    时间: 2009-02-25 19:35
我的愿意是
在linux中,在网络、串口中发送或读取数据的时候,发送或读取的字节数可能不是你想发送或读取的字节数,而要分两次。
这是什么原因?
作者: hellioncu    时间: 2009-02-26 09:10
跟协议特性有关呀。UDP是不会这样的。TCP是数据流协议,要处理粘包等。仔细去看看书吧
作者: wzw19191    时间: 2009-04-20 00:16
UDP提供不安全的数据报服务,而非TCP的字节流服务。
所以你提供的buffer就是一个数据报(一个整体),在用sendto发送数据的时候一般不用判断是否发送了全部或部分。
另外,sendto成功返回只代表数据报已成功放入内核输出缓冲队列,至于对方是否接收到,不得而知。
作者: xinglp    时间: 2009-04-20 01:44
标题: 回复 #9 alexhappy 的帖子
就是连接模式也还是UDP吧, 就是这边发多大,那边收多大
作者: 雨过白鹭洲    时间: 2009-04-20 08:59
分两次收就再次收嘛,收完统一处理




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2