社区
Linux/Unix社区
帖子详情
udp通讯,想建两个套接字和本机绑定,一个用于接收广播消息,一个用于点对点通讯接收数据,为什么不行?
scoredhigh
2014-01-03 11:02:10
udp通讯,想建两个套接字和本机绑定,一个用于接收广播消息,一个用于点对点通讯接收数据,为什么不行?
本人通过地址复用创建了两个socket与本机同一端口绑定作为服务器接收广播消息和某个客户端发来的数据,只有一个socket可以接受到广播消息,另一个socket接收不到客户端发来的数据,客户端的ip和端口设置与服务器接收数据的socket设置是对应的,为什么会收不到数据?
...全文
157
3
打赏
收藏
udp通讯,想建两个套接字和本机绑定,一个用于接收广播消息,一个用于点对点通讯接收数据,为什么不行?
udp通讯,想建两个套接字和本机绑定,一个用于接收广播消息,一个用于点对点通讯接收数据,为什么不行? 本人通过地址复用创建了两个socket与本机同一端口绑定作为服务器接收广播消息和某个客户端发来的数据,只有一个socket可以接受到广播消息,另一个socket接收不到客户端发来的数据,客户端的ip和端口设置与服务器接收数据的socket设置是对应的,为什么会收不到数据?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
max_min_
2014-01-04
打赏
举报
回复
通信部分的代码贴出来看看、@
qingfeideyi
2014-01-04
打赏
举报
回复
贴上代码啊 兄弟。。
scoredhigh
2014-01-04
打赏
举报
回复
多谢回帖啊 #define PORT_NUMBERE 6001 #define PORT_NUMBERE_ANO 7001 广播发送代码 VOID BroadcastSendTask(VOID *pdata) { int broadcast_sock = INVALID_SOCKET; int count = 0, i, len, sendlen; struct sockaddr_in local_addr, to_addr; INT8U sendbuf[300]; //printf ("BroadcastSendTask XXXXXXXXXXXXXXXX gOnlineMonitor.monitors[%d].timecount=%d.\n", i, gOnlineMonitor.monitors[i].timecount); broadcast_sock = socket(AF_INET, SOCK_DGRAM, 0); if (broadcast_sock == INVALID_SOCKET) { return; } int opt = 1; setsockopt(broadcast_sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt)); while (count < 2) { count++; ms_sleep(1000); } count = 4; while (1) { if (count >= 4) { SendBroadcastPack(broadcast_sock, sendbuf); count = 0; } ms_sleep(1000); } } 广播接收的代码 VOID BroadcastRecvTask(VOID *pdata) { struct sockaddr_in from_addr, local_addr; char recgbuf[300]; int nsize = 0, opt = 1, count = 0, recvlen, datalen, i, ret; INT16U cmd; int machine_number; INT32U seq_pack_num; INT8U *ack; char flag; LYYMONITORINFO tmpmonitor; //printf ("BroadcastRecvTask XXXXXXXXXXXXXXXXXXXXXXXXX #1.\n"); gOnlineMonitor.cur_count = 0; //用UDP初始化套接字 broadcast_recv_sock = socket(AF_INET, SOCK_DGRAM, 0); memset(&local_addr, 0, sizeof(struct sockaddr_in)); memset(&from_addr, 0, sizeof(struct sockaddr_in)); local_addr.sin_family = AF_INET; //local_addr.sin_addr.s_addr = 0; local_addr.sin_addr.s_addr = htonl(INADDR_ANY); local_addr.sin_port = htons(PORT_NUMBERE); setsockopt(broadcast_recv_sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt)); setsockopt(broadcast_recv_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)); ret = bind(broadcast_recv_sock, (struct sockaddr *)&local_addr,sizeof(struct sockaddr_in)); if (ret < 0) { //printf ("BroadcastRecvTask bind error ret=%d\n", ret); } while (count < 2) { count++; ms_sleep(1000); } count = 0; nsize = sizeof(struct sockaddr_in); while (1) { recvlen = recvfrom(broadcast_recv_sock, recgbuf, 300, 0, (struct sockaddr *)&from_addr,(int *)&nsize); //////////////////// 接收数据的处理 //////////////////// ms_sleep(500); } } 数据发送的代码 VOID CommSendTask(VOID *pdata) { int count = 0, i, len, sendlen; struct sockaddr_in local_addr, to_addr; INT8U sendbuf[2048]; char ipbuf[20]; sockfd = socket(AF_INET, SOCK_DGRAM, 0); while (count < 2) { count++; ms_sleep(1000); } count = 4; //signal_flag = 1; while (1) { for (i = 0; i < gRequestMonitor.cur_count; i++) { //if (gRequestMonitor.monitors[i].comflag == 1) { sprintf(ipbuf, "%d.%d.%d.%d", gRequestMonitor.monitors[i].ip[0], gRequestMonitor.monitors[i].ip[1], gRequestMonitor.monitors[i].ip[2], gRequestMonitor.monitors[i].ip[3]); //printf ("CommSendTask XXXXXXXXXXXXX ipbuf =%s.\n", ipbuf); memset(&to_addr, 0, sizeof(struct sockaddr_in)); to_addr.sin_family = AF_INET; to_addr.sin_addr.s_addr = inet_addr(ipbuf); to_addr.sin_port = htons(PORT_NUMBERE_ANO); //printf ("CommSendTask XXXXXXXXXXXXXXXXXXXXXXXXX #1.\n"); len = viewbed_pack_ecg1_info(sendbuf); sendlen = sendto(sockfd, sendbuf, len, 0, (struct sockaddr *)&to_addr, sizeof(struct sockaddr)); //printf ("CommSendTask XXXXXXXXXXXXXXXXXXXXXXXXX #2.\n"); if(sendlen > 0) { //printf("send ecg1 data success\n\r"); } } } count++; ms_sleep(1000); } } 数据接收的代码 VOID CommRecvTask(VOID *pdata) { struct sockaddr_in local_addr, from_addr; int nsize = 0, datalen, ret, opt = 1; char recgbuf[2048]; INT16U cmd; int machine_number; INT32U seq_pack_num; INT8U *ack; INT8U ip[20]; int len, count = 0, recvlen = sizeof(struct sockaddr); //printf ("CommRecvTask XXXXXXXXXXXXXXXXXXXXXXXXX #1.\n"); //初始化套接字 recv_sock = socket(AF_INET, SOCK_DGRAM, 0); memset(&local_addr, 0, sizeof(struct sockaddr_in)); local_addr.sin_family = AF_INET; local_addr.sin_addr.s_addr = 0; local_addr.sin_addr.s_addr = htonl(INADDR_ANY); local_addr.sin_port = htons(PORT_NUMBERE_ANO); setsockopt(recv_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)); ret = bind(recv_sock, (struct sockaddr *)&local_addr,sizeof(struct sockaddr_in)); if (ret < 0) { printf ("CommRecvTask bind error ret=%d\n", ret); } while (count < 2) { count++; ms_sleep(1000); } while (1) { recvlen = recvfrom(recv_sock, recgbuf, 1460, 0, (struct sockaddr *)&from_addr,(int *)&nsize); //printf ("CommRecvTask XXXXXXXXXXXXXXXXXXXXXXXXX #1.\n"); if (recvlen > 2) { /////// 数据处理 //////// } ms_sleep(500); } } 上面的代码,接收广播消息可以,但是接收数据不行,如果将接收数据的recv_sock换成broadcast_recv_sock就可以接收数据了,可以会有很多广播消息和数据混杂起来。 就算将接收数据和发送数据的端口改成与广播的端口一样,还是不行啊
UDP
服务器
广播
+实现跨网段
通讯
本文介绍了
UDP
协议和
广播
的原理,展示了如何通过
UDP
广播
实现在不同网段下的
通讯
。详细讨论了
UDP
服务器的实现过程,以及解决跨网段通信问题的方法,最后提供了工程文件的下载链接。
JAVA
UDP
发送和
接收
数据
本文详细介绍了JAVA中
UDP
的三种
通讯
方式:单播、
广播
和组播。通过实例代码展示了如何进行数据的发送与
接收
,包括单次发送、多发多收以及
广播
和组播的实现,帮助读者理解
UDP
通信的基本原理和操作步骤。
第九篇:Linux下socket
广播
通讯
的实现
本文介绍了Linux下socket
广播
通讯
的实现。
广播
采用
UDP
,需用函数设置
套接字
选项以启用
广播
。文中给出函数原型、选项说明及框架示例代码,阐述完整
广播
过程,包括创建
套接字
、设置选项、
绑定
及发送
消息
等,还提及
接收
广播
消息
的方法及相关注意事项。
鸿蒙Harmony编程开发:
UDP
消息
发送应用示例
本文介绍鸿蒙系统中
UDP
通讯
的基本概念与方法,包括创建
UDP
Socket实例、
绑定
端口、发送数据和
接收
消息
。通过
一个
具体示例展示了如何搭建
一个
简单的
UDP
消息
发送与
接收
应用。
oc下实现局域网
udp
广播
通讯
使用开源框架GCDAsync
Udp
Socket
本文介绍了在Objective-C环境下,如何利用开源框架GCDAsync
Udp
Socket实现局域网内的
UDP
广播
通信。讲解了
UDP
协议的特点,以及GCDAsync
Udp
Socket的使用方法,包括设置代理、发送和
接收
数据
的步骤。此外,还强调了客户端和服务器端的端口号可以不一致,并提供了服务端
接收
到
消息
的代理方法示例。
Linux/Unix社区
23,223
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章