麻烦各位帮忙看看,UDP组播,发送端只发送一个数据包,我感觉接收端收到了无数个数据。

ackfbcu 2015-05-26 06:15:22
接收端创建两个线程,一个用来收数据,一个用来处理数据。两个线程通过循环队列通信。
接收端线程1代码:就是不停的接数据,放入队列中
while (1)
{
ret = recvfrom(sock_id, &udp_ret, length, 0, (struct sockaddr *)&sender, &len);
printf("%s:%d,%s\n",__FILE__,__LINE__,udp_ret.prm);
if (ret < 0)
{
printf("%s:%d,recvfrom:%s\n",__FILE__,__LINE__,strerror(errno));
return NULL;
}
// printf("%s,%s,%s:%d\n",udp_ret.prm,udp_ret.type,udp_ret.zy_data,i++);
if (thread_flag)
{
thread_flag = 0;
return NULL;
}else
{
if (IsQueueFull(q))
{
printf("%s:%d,queue is full in udp_recv,we will miss %d package\n",__FILE__,__LINE__,i++);
}else
{
EnQueue(q,udp_ret);
printf("%s:%d,queue is write in %d\n",__FILE__,__LINE__,i++);
}
}
memset(&udp_ret,0,sizeof(udp_ret));
}

发送端代码:要是输入2就发一个包给接收端
char a[2] = " ";
scanf("%c",a);
send_message(a);
if ('2' == a[0])
{
ret = sendto(sock_id, p, length, 0, (struct sockaddr *)&addr, len);
if (ret < 0)
{
perror("sendto error");
exit(1);
}
}
free(p);
close(sock_id);

这个程序运行后结果如下:
发送端:
[centos:/root]#./send
2

接收端:
recv1.c:65,hello
recv1.c:84,queue is write in 0
hello,hello,hello world:0
recv1.c:65,hello
recv1.c:84,queue is write in 1
hello,hello,hello world:1
recv1.c:65,hello
recv1.c:84,queue is write in 2
hello,hello,hello world:2
recv1.c:65,hello
recv1.c:84,queue is write in 3
hello,hello,hello world:3
发送端输入一个2,接收端就开始不停的收到数据,UDP组播是在局域网内,没听说UDP有这种特性啊,麻烦各位大侠看看我的程序是不是哪块写的不好导致这个问题?谢谢

...全文
696 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ackfbcu 2015-06-01
  • 打赏
  • 举报
回复
引用 7 楼 shenyi0106 的回复:
[quote=引用 6 楼 flowaway_ 的回复:] [quote=引用 5 楼 shenyi0106 的回复:] 看看局域网有没有接环路
接收端和发送端都在一台电脑上,有没有环路我不太清楚,前一天发一个数据包接到无数数据包,第二天发一个数据包接到一个数据包。[/quote] 如果无环路的情况下,那就是机器上有多块使用中的网卡(虚拟网卡也算);一般而言,有多少块网卡,就会收到多少相同的数据[/quote] 有道理,网卡应该也会影响接收的数据量。但我感觉我遇到的这个情况跟网卡数量没关系,出问题时我也没一个一个问题的仔细排查下,现在也没法验证什么了,谢谢热心回答了
shenyi0106 2015-05-29
  • 打赏
  • 举报
回复
引用 6 楼 flowaway_ 的回复:
[quote=引用 5 楼 shenyi0106 的回复:] 看看局域网有没有接环路
接收端和发送端都在一台电脑上,有没有环路我不太清楚,前一天发一个数据包接到无数数据包,第二天发一个数据包接到一个数据包。[/quote] 如果无环路的情况下,那就是机器上有多块使用中的网卡(虚拟网卡也算);一般而言,有多少块网卡,就会收到多少相同的数据
ackfbcu 2015-05-29
  • 打赏
  • 举报
回复
引用 5 楼 shenyi0106 的回复:
看看局域网有没有接环路
接收端和发送端都在一台电脑上,有没有环路我不太清楚,前一天发一个数据包接到无数数据包,第二天发一个数据包接到一个数据包。
shenyi0106 2015-05-28
  • 打赏
  • 举报
回复
看看局域网有没有接环路
ackfbcu 2015-05-27
  • 打赏
  • 举报
回复
引用 3 楼 xian_wwq 的回复:
csdn的解释: 如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。 接收数据之前把自己的buffer最好memset下
这个程序没返回错误值,今天我试了下,发一个包接的结束端就接到一个数据包了,我想不太明白怎么回事。
xian_wwq 2015-05-27
  • 打赏
  • 举报
回复
csdn的解释: 如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。 接收数据之前把自己的buffer最好memset下
ackfbcu 2015-05-26
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
你要判断一下recvfrom()返回值ret的值是多少。
ret的值是发送端发送的数据包的大小 recv1.c:65,ret = 8256 recv1.c:84,queue is write in 0 hello,hello,hello world:0 recv1.c:65,ret = 8256 recv1.c:84,queue is write in 1 hello,hello,hello world:1 组播的IP地址是244.0.1.1,端口是5000
Eleven 2015-05-26
  • 打赏
  • 举报
回复
你要判断一下recvfrom()返回值ret的值是多少。

18,356

社区成员

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

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