- 论坛徽章:
- 0
|
回复人:galaxy_fxstar(阿星) 二级(初级) 信誉:100 2005-1-31 14:37:46 得分:10
------//将上一个问题换一种提法:
若同一个socket连续发送了两个数据包(UDP,间隔很小),接收端采用recvfrom()接收,是一次接收完两个数据包,还是会分两次接收(一次一个包)?如果是后者的话,就不用确定数据边界了。
//
发送端使用sendto()和接收端使用recvfrom()是配对的,也就是说每使用一次recvfrom()只能接收一个sendto()发送的报文,而且两个函数的size是一致的,并且都制定了ip+port,这样的话接收可以准确并且唯一的得到数据。
对于多个机器做为发送端的情况,接收端应该为每个机器开一个线程来做处理。
TOP
回复人: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中应该不会出现的因为他没有保障机制
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/15071/showart_1131323.html |
|