udp通讯,想建两个套接字和本机绑定,一个用于接收广播消息,一个用于点对点通讯接收数据,为什么不行?

scoredhigh 2014-01-03 11:02:10
udp通讯,想建两个套接字和本机绑定,一个用于接收广播消息,一个用于点对点通讯接收数据,为什么不行?
本人通过地址复用创建了两个socket与本机同一端口绑定作为服务器接收广播消息和某个客户端发来的数据,只有一个socket可以接受到广播消息,另一个socket接收不到客户端发来的数据,客户端的ip和端口设置与服务器接收数据的socket设置是对应的,为什么会收不到数据?
...全文
121 3 打赏 收藏 转发到动态 举报
写回复
用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就可以接收数据了,可以会有很多广播消息和数据混杂起来。 就算将接收数据和发送数据的端口改成与广播的端口一样,还是不行啊

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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