社区
Linux/Unix社区
帖子详情
udp通讯,想建两个套接字和本机绑定,一个用于接收广播消息,一个用于点对点通讯接收数据,为什么不行?
scoredhigh
2014-01-03 11:02:10
udp通讯,想建两个套接字和本机绑定,一个用于接收广播消息,一个用于点对点通讯接收数据,为什么不行?
本人通过地址复用创建了两个socket与本机同一端口绑定作为服务器接收广播消息和某个客户端发来的数据,只有一个socket可以接受到广播消息,另一个socket接收不到客户端发来的数据,客户端的ip和端口设置与服务器接收数据的socket设置是对应的,为什么会收不到数据?
...全文
137
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就可以接收数据了,可以会有很多广播消息和数据混杂起来。 就算将接收数据和发送数据的端口改成与广播的端口一样,还是不行啊
C#的Socket实现
UDP
协议通信
C#的Socket实现
UDP
协议通信 CSharp
头歌:Ping服务端创建
UDP
套接字
(底部附全关完整答案)
头歌第1关:Ping服务端创建
UDP
套接字
-网络基础文档类资源-CSDN文库 头歌
UDP
Ping程序实现-
接收
并转发
消息
-网络基础文档类资源-CSDN文库 头歌
UDP
Ping程序实现-服务端模拟丢包事件-网络基础文档类资源-CSDN文库 头歌
UDP
Ping程序实现-客户端创建
UDP
套接字
-网络基础文档类资源-CSDN文库 头歌
UDP
Ping程序实现-客户端向服务器发送
消息
并
接收
消息
.txt-网络基础文档类资源-CSDN文库
网络
套接字
(
Udp
实现简单的网络通信)
对于服务器来说,如果
绑定
的是确定的IP,那么只有发向该IP的数据才会被交给网络进程,但是一般服务器可能由多张网卡,配置了多个IP,我们需要不是发给某个IP的数据,而是发给所有IP的数据,因此在
绑定
服务器IP的时候,通常使用INADDR_ANY。第
一个
参数表示
套接字
的文件描述符,第二个参数表示缓冲区的大小,第三个参数表示方式,第四个参数表示向谁发送数据,第五个参数表示发送数据的长度。当创建
套接字
失败,则返回-1,如果成功则返回的是
套接字
的文件描述符,
套接字
是
一个
抽象层,用户可以将其像文件一样打开,读写操作。.
详解
UDP
/TCP
套接字
在IP数据包头部中, 有
两个
IP地址, 分别叫做源IP地址, 和目的IP地址。
UDP
特性之
广播
UDP
的
广播
和日常生活中的
广播
是一样的,都是一种快速传播
消息
的方式,因此
广播
的开销很小,发送端使用
一个
广播
地址,就可以将数据发送到多个
接收
数据
的终端上,如果不使用
广播
,就需要进行多次发送才能将数据分别发送到不同的主机上。对于
接收
广播
消息
的一端,必须要
绑定
固定的端口,并由
广播
端将
广播
消息
发送到这个端口上,因此所有
接收
端都应
绑定
相同的端口,这样才能同时收到
广播
数据。只要发送端在发送
广播
消息
,数据
接收
端就能收到
广播
消息
,
消息
的
接收
是无法拒绝的,除非将
接收
端的进程关闭,就
接收
不到了。
Linux/Unix社区
23,223
社区成员
74,537
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章