Chinaunix首页 | 论坛 | 博客
  • 博客访问: 536526
  • 博文数量: 120
  • 博客积分: 3030
  • 博客等级: 中校
  • 技术积分: 1445
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-05 01:00
文章存档

2011年(1)

2009年(2)

2008年(32)

2007年(33)

2006年(52)

我的朋友

分类: LINUX

2008-08-15 11:28:24

回复人:galaxy_fxstar(阿星)  二级(初级)  信誉:100      2005-1-31 14:37:46  得分:10

------//将上一个问题换一种提法:
若同一个socket连续发送了两个数据包(UDP,间隔很小),接收端采用recvfrom()接收,是一次接收完两个数据包,还是会分两次接收(一次一个包)?如果是后者的话,就不用确定数据边界了。

//
发送端使用sendto()和接收端使用recvfrom()是配对的,也就是说每使用一次recvfrom()只能接收一个sendto()发送的报文,而且两个函数的size是一致的,并且都制定了ip+port,这样的话接收可以准确并且唯一的得到数据。
对于多个机器做为发送端的情况,接收端应该为每个机器开一个线程来做处理。

回复人:gdy119(夜风微凉)  一星(中级)  信誉:105      2005-1-31 17:04:26  得分:20


to comman_wang (一加一) :
recvfrom(,,,size) 中可以指定你想收的IP+PORT,
如果错误的话,就是你同一个socket连续发送了数据
但recvfrom(,,,size)收到的SIZE变大了,这个到是要考虑的
//========================================================
抱歉,我做TCP惯了(^_^)所以上面我说的是TCP情况,UDP是面向
消息的协议,不管你调用多少次sendto(),而接收端调用了多少次recvfrom
(无论网络堆栈有多少数据可读)数据报是不会重叠的!!
还有我做补充的是,你发心跳包大小要一定,因为:
UDP数据报的数据区最大长度为1472字节(在局域网--以太网中),而在internet
中一般数据最大(路由器容许一次通过的数据包)为548字节,最好将UDP的数据长度控
制在548字节(576-8-20)以内.

 

 

 

 

udp收报文的方式跟tcp是不同的,做tcp习惯了呵呵容易混淆 ,另外的这种情况只存在tcp中吧 ,就是比如 tcp包发出去后 对方没有收到 这个时候就需要重传 ,此时就出现了2个tcp包叠加在一个包中的情况 呵呵 但这种情况在udp中应该不会出现的因为他没有保障机制

 

阅读(2495) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~