社区
Linux/Unix社区
帖子详情
udp通讯,想建两个套接字和本机绑定,一个用于接收广播消息,一个用于点对点通讯接收数据,为什么不行?
scoredhigh
2014-01-03 11:02:10
udp通讯,想建两个套接字和本机绑定,一个用于接收广播消息,一个用于点对点通讯接收数据,为什么不行?
本人通过地址复用创建了两个socket与本机同一端口绑定作为服务器接收广播消息和某个客户端发来的数据,只有一个socket可以接受到广播消息,另一个socket接收不到客户端发来的数据,客户端的ip和端口设置与服务器接收数据的socket设置是对应的,为什么会收不到数据?
...全文
121
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就可以接收数据了,可以会有很多广播消息和数据混杂起来。 就算将接收数据和发送数据的端口改成与广播的端口一样,还是不行啊
计算机网络 传输层 TCP和
UDP
协议
Re: 计算机网络 传输层 TCP和
UDP
协议 # 传输层协议 TCP 和
UDP
的应用场景 要发送的内容多,需要将发送的内容分成多个数据包发送(TCP) 要发送的内容少,
一个
数据包就能发送全部内容(
UDP
) # 传输层协议和应用层...
TCP/
UDP
套接字
TCP/
UDP
套接字
socket
套接字
相当于网络通信两端的插座,只要对方的socket和自己的socket有通信连接,双方就可以发送和
接收
数据
。 网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分...
Linux——
UDP
协议与相关
套接字
编程
因此
套接字
由IP地址、端口号port以及通信协议方式(TCP/
UDP
)组成。我们知道,在网络通信中通过
一个
IP地址可以锁定一台主机,通过端口号可以锁定一台主机上某
一个
进程。因此IP地址+端口号可以锁定全网中唯一的进程,...
网络
套接字
实现
UDP
机制通信
1、创建
套接字
int sock = socket(AF_INET /*协议种族*/, SOCK_DGRAM /*通信类型*/, 0);2、
绑定
ip和端口号3、提供服务......
【网络编程】详解
UDP
/TCP
套接字
的创建流程+守护进程
UDP
协议和TCP协议创建
套接字
的全过程。
Linux/Unix社区
23,116
社区成员
74,507
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章