一次发送256个UDP数据包,recvfrom为什么接收不全?

a3883821 2013-05-02 08:19:32
发送端是由FPGA发送的数据,一次发送256个UDP数据包,每个包512字节,接收端是开了个线程,由recvfrom接收,可是只能接收十几个数据包。由抓包工具可以抓到发到网卡上的256个数据包,这是为什么呀?

本人第一次接触网络编程,还请高手指点迷津,谢谢!
...全文
1593 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
w420244977 2015-07-07
  • 打赏
  • 举报
回复
这个问题应该是缓冲区过小造成的。因为根据你所说的只能接受8k左右,而套接字默认缓冲区大小就是8k。可能在你正在处理接收的数据时,缓冲区已经被后面发来的数据填满。解决方法还是得放在接受速度上。
lvtingting2007 2013-11-28
  • 打赏
  • 举报
回复
不知道此问题最终结论是啥
a3883821 2013-05-15
  • 打赏
  • 举报
回复
有没有办法从UDP接收这端进行改进呢?发送端那边的话,抓包可以看到,所以人家不改。换个接收函数会不会有效果呀?
Squall_zy 2013-05-14
  • 打赏
  • 举报
回复
缓冲区设定为10MB,就行了。
随风随恨 2013-05-14
  • 打赏
  • 举报
回复
引用 30 楼 u010116861 的回复:
小建议:让对话sleep几毫秒试下。以前试过,挺有用
不好意思打错了,是对方
随风随恨 2013-05-14
  • 打赏
  • 举报
回复
小建议:让对话sleep几毫秒试下。以前试过,挺有用
steed_jet 2013-05-14
  • 打赏
  • 举报
回复
是否有可能对方发送的就存在问题?
shiter 2013-05-14
  • 打赏
  • 举报
回复
引用 31 楼 u010116861 的回复:
[quote=引用 30 楼 u010116861 的回复:] 小建议:让对话sleep几毫秒试下。以前试过,挺有用
不好意思打错了,是对方[/quote] 多睡几下。。。
a3883821 2013-05-10
  • 打赏
  • 举报
回复
FPGA发过来256个包,包跟包之间的间隔是100ns,是不是跟这个有关系呢?速度都是千兆的。我在网上有看到说调用一次recvfrom要花掉大约5.7us,这个数据可靠吗? 如果真是这样的情况的话,那岂不是只有缓冲区中的数据包可以收到了吗?该怎么改善这样的情况!!! 有没有别的办法进行网络编程,可以使接收数据包的速度快些呢?
liangxd09 2013-05-07
  • 打赏
  • 举报
回复
找个 抓包工具,一抓 就知道有没有发过来了
steed_jet 2013-05-07
  • 打赏
  • 举报
回复
数据接收之后分析处理交给另外一个线程吧,这样接收线程压力应该会小一些。 另可以写一些代码加上断点,调试的时候让程序在特定的值中断调试一下看看是什么情况。
a3883821 2013-05-07
  • 打赏
  • 举报
回复
缓冲区大于32*1024时,接收到的包比原来发送的包还多(且可变),并且后面的数据通过AppendTxt(buf, iDataLen, txtBox)解析不出来。如果把recvfrom函数中的buf数组增大,则接收数据也不理想,还没有512时的稳定!
steed_jet 2013-05-07
  • 打赏
  • 举报
回复
缓冲区再大一些会不会好一些。
a3883821 2013-05-06
  • 打赏
  • 举报
回复
不好意思,recvfrom函数中的buf长度也是512
a3883821 2013-05-06
  • 打赏
  • 举报
回复
接收线程函数如下: char txtBox[240000]; CString saveData; int k=0; UINT recvThread(LPVOID lParam) { CSendudpDlg *pdlg = (CSendudpDlg *)lParam; unsigned char buf[512]; int iDataLen; SOCKADDR_IN enet_receive_addr; SOCKADDR_IN enet_cur_addr; SOCKET enet_receive_socket; int len = sizeof(enet_cur_addr); enet_receive_addr.sin_family = AF_INET; enet_receive_addr.sin_port = htons(pdlg->m_portsrc); enet_receive_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); if ((enet_receive_socket=socket (AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET ) { pdlg->MessageBox("cannot create enet_receive_socket\n"); return -1; } if (bind (enet_receive_socket, (struct sockaddr *)&enet_receive_addr, sizeof(enet_receive_addr)) == SOCKET_ERROR) { pdlg->MessageBox ("Bind enet_receive_socket failed\n"); return -1; } int nRecvBUflen=32*1024; setsockopt(enet_receive_socket,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBUflen,sizeof(int)); txtBox[0] = 0; memset(buf,0,512); while(pdlg->isListen) { if((iDataLen = recvfrom(enet_receive_socket, (char *)buf, 500, 0, (struct sockaddr *)&enet_cur_addr,&len)) != ERROR) { k++;//接收多少个包 //AppendTxt(buf, iDataLen, txtBox); //pdlg->m_rcvTxt.SetWindowText(txtBox); //saveData+=txtBox; saveData+=buf; } } closesocket(enet_receive_socket); shutdown (enet_receive_socket, 0x00); return 0; }
弱水垂钓 2013-05-06
  • 打赏
  • 举报
回复
No Code, No Truth
steed_jet 2013-05-06
  • 打赏
  • 举报
回复
1.可能是你代码解析数据有问题 2.可能对方发送了一些无效的数据 3.对方可能一直在不断循环发送,速度比较快,但是你解析的比较慢 如果抓包工具显示对方没有发送无效数据,就是你程序的问题。贴上代码让大家给你看看吧
  • 打赏
  • 举报
回复
这样挺起来像没有丢包, 发送之间有点间隔呢 Sleep(100)。 我怀疑下层的接收缓冲区满了, 扔包了。
a3883821 2013-05-06
  • 打赏
  • 举报
回复
用setsockopt设置接收缓冲区的大小了,但是好像超过32*1024时,接收这边的数据包个数不定。FPGA发送过来的是十六进制数,我这边还得做相关的转换才可以正确显示其内容,当接收缓冲区的大小设成128*1024,也即刚好和发送数据总大小相同时,收到的数据居然可以超过发送的数据长度,而且超过128个包时,解析不了原数据内容,只是一些乱码……
a3883821 2013-05-06
  • 打赏
  • 举报
回复
代码当然是这样啦,在while循环中的AppendTxt(buf, iDataLen, txtBox)函数是将接收的数据转变为十六进制显示,如果去掉这样函数的话,K值每发一次(256个包),k的值就变化一次,如果保留的话(前提是我已设置setsockopt缓冲区大小为32*1024),k的值在64(个包,且是顺序接收)附近变化,如果k>64,则最后一个包则是与前边不连续的UDP包
加载更多回复(16)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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