UDP接收多个文件包为什么会丢包?

linchangle 2005-10-08 02:14:19
客户端使用linux,服务器系统是windows2000
服务器的udp服务器使用控件TIDUdpServer
linux的udp客户端用c写的
客户端向服务器发送20个数据包,每个大小为1k,确认20个数据包都已经发送
可是服务器收到的数据包个数不是20个
我试了5回,个数分别是10,7,13,15,17
这是怎么回事?

TIDUdpServer的接收代码如下:
void __fastcall TForm1::udpserver1UDPRead(TObject *Sender, TStream *AData,
TIdSocketHandle *ABinding)
{
int size;

char Buf[1200];
memset(Buf,0,1200);
size=AData->Size;

AData->ReadBuffer(Buf,size);
Buf[size]=0;

fwrite(Buf,sizeof(char),size,out); //out是我之前初始化过的FILE *类型
m++;
edt1->Text=m;

}
...全文
474 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
土著巫师 2005-12-09
  • 打赏
  • 举报
回复
申明:
1、UDP是非连接的,有边界的,所以绝不会出现UDP包合并的情况。
2、UDP是无序的,所以后发的数据包可能先收到。(在局域网内可以不考虑,无序只是相对面象连接的协议而言)
3、UDP是不可靠的,所以可能发的数据你却收不到。(在局域网内可以不考虑,不可靠只是相对面象可靠的连接协议而言,网络不好,TCP照样收不到数据)
4、充分考虑接收缓冲区大小,一个包的长度在UDP协议里是用short值来表示的,所以可以事先建一个64k的缓区重复使用,每次接收64K大小(实际返回是你的包大小)。丢包通常是提供给WSARecv缓冲区的长度太小。
mugi 2005-12-09
  • 打赏
  • 举报
回复
接收的一端要有回应包确认才能确保文件流传输正确,如果发现传输出错,就重新尝试传输,直到传输正确为止,比较麻烦,如果可能的话,建议使用TCP。
  • 打赏
  • 举报
回复
UDP报文是不会合并的,TCP才有可能。
glassegg 2005-11-11
  • 打赏
  • 举报
回复
一般情况下,应该不会丢的。除非lz的20个包在30ms以下发完,还有可能。
这个功能应给可以实现,没问题。
lz的代码,好像没问题。
你注释掉写文件的操作,看看是不是能好点?
glassegg 2005-11-11
  • 打赏
  • 举报
回复
1楼真是笑星哈~
sydt 2005-11-11
  • 打赏
  • 举报
回复
借楼主宝地一用!!!

To: pp616(傻小子)
http://community.csdn.net/Expert/ForumList.asp?roomid=5507&typenum=1
sydt@sina.com

能不能把你用socket发送和接收文件程序给一份源码!
要不我单独开帖100索求源码?
我不懂电脑 2005-10-18
  • 打赏
  • 举报
回复
udp是不可靠的协议,基础硬件网络不好的话,很容易丢包。
pp616 2005-10-18
  • 打赏
  • 举报
回复
udp不丢包就不是udp了:)
noahfz 2005-10-11
  • 打赏
  • 举报
回复
UDP是无连接得,丢包是难免得,可以检查一下网络状况,还有你的接受端的Buffer,是否超出了Size.一般UDP包都是4个数据包+1个校验包的发这样的话5个包丢了任何一个包都可以还原的,当然丢了2个就无法还原了,呵呵
Maconel 2005-10-08
  • 打赏
  • 举报
回复
udp如果发得快,会把几包当成一包来收,所以看看是不是收到的数据大于1200,导致出错。
还有udp是无连接协议,不检查数据是否发送成功,所以有可能是因为网络问题导致丢包。这时应该自己手动检查,并将没有发成功的包重新发一遍。
xibingwuqing 2005-10-08
  • 打赏
  • 举报
回复
刚问完就发现答案了,汗
xibingwuqing 2005-10-08
  • 打赏
  • 举报
回复
不会,悄悄地问一句:哪里是接收的语句,好像AData基本没用上?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧