麻烦各位帮忙看看,UDP组播,发送端只发送一个数据包,小弟我感觉接收端收到了无数个数据
麻烦各位帮忙看看,UDP组播,发送端只发送一个数据包,我感觉接收端收到了无数个数据。
接收端创建两个线程,一个用来收数据,一个用来处理数据。两个线程通过循环队列通信。
接收端线程1代码:就是不停的接数据,放入队列中
发送端代码:要是输入2就发一个包给接收端
这个程序运行后结果如下:
发送端:
[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有这种特性啊,麻烦各位大侠看看我的程序是不是哪块写的不好导致这个问题?谢谢
------解决思路----------------------
看看局域网有没有接环路
接收端创建两个线程,一个用来收数据,一个用来处理数据。两个线程通过循环队列通信。
接收端线程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有这种特性啊,麻烦各位大侠看看我的程序是不是哪块写的不好导致这个问题?谢谢
------解决思路----------------------
看看局域网有没有接环路