Linux系统下UDP发送和接收广播消息小例子
来源:互联网 发布:硬盘划伤 数据恢复 编辑:程序博客网 时间:2024/04/29 20:51
分类: 网络通信 2013-01-07 10:54 1336人阅读 评论(6)收藏 举报
- // 发送端
- #include <iostream>
- #include <stdio.h>
- #include <sys/socket.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <netdb.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <string.h>
- using namespace std;
- int main()
- {
- setvbuf(stdout, NULL, _IONBF, 0);
- fflush(stdout);
- int sock = -1;
- if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- {
- cout<<"socket error"<<endl;
- return false;
- }
- const int opt = 1;
- //设置该套接字为广播类型,
- int nb = 0;
- nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
- if(nb == -1)
- {
- cout<<"set socket error..."<<endl;
- return false;
- }
- struct sockaddr_in addrto;
- bzero(&addrto, sizeof(struct sockaddr_in));
- addrto.sin_family=AF_INET;
- addrto.sin_addr.s_addr=htonl(INADDR_BROADCAST);
- addrto.sin_port=htons(6000);
- int nlen=sizeof(addrto);
- while(1)
- {
- sleep(1);
- //从广播地址发送消息
- char smsg[] = {"abcdef"};
- int ret=sendto(sock, smsg, strlen(smsg), 0, (sockaddr*)&addrto, nlen);
- if(ret<0)
- {
- cout<<"send error...."<<ret<<endl;
- }
- else
- {
- printf("ok ");
- }
- }
- return 0;
- }
// 发送端#include <iostream>#include <stdio.h>#include <sys/socket.h>#include <unistd.h>#include <sys/types.h>#include <netdb.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>using namespace std;int main(){setvbuf(stdout, NULL, _IONBF, 0); fflush(stdout); int sock = -1;if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { cout<<"socket error"<<endl;return false;} const int opt = 1;//设置该套接字为广播类型,int nb = 0;nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));if(nb == -1){cout<<"set socket error..."<<endl;return false;}struct sockaddr_in addrto;bzero(&addrto, sizeof(struct sockaddr_in));addrto.sin_family=AF_INET;addrto.sin_addr.s_addr=htonl(INADDR_BROADCAST);addrto.sin_port=htons(6000);int nlen=sizeof(addrto);while(1){sleep(1);//从广播地址发送消息char smsg[] = {"abcdef"};int ret=sendto(sock, smsg, strlen(smsg), 0, (sockaddr*)&addrto, nlen);if(ret<0){cout<<"send error...."<<ret<<endl;}else{printf("ok ");}}return 0;}
- // 接收端 http://blog.csdn.net/robertkun
- #include <iostream>
- #include <stdio.h>
- #include <sys/socket.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <netdb.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <string.h>
- using namespace std;
- int main()
- {
- setvbuf(stdout, NULL, _IONBF, 0);
- fflush(stdout);
- // 绑定地址
- struct sockaddr_in addrto;
- bzero(&addrto, sizeof(struct sockaddr_in));
- addrto.sin_family = AF_INET;
- addrto.sin_addr.s_addr = htonl(INADDR_ANY);
- addrto.sin_port = htons(6000);
- // 广播地址
- struct sockaddr_in from;
- bzero(&from, sizeof(struct sockaddr_in));
- from.sin_family = AF_INET;
- from.sin_addr.s_addr = htonl(INADDR_ANY);
- from.sin_port = htons(6000);
- int sock = -1;
- if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- {
- cout<<"socket error"<<endl;
- return false;
- }
- const int opt = 1;
- //设置该套接字为广播类型,
- int nb = 0;
- nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
- if(nb == -1)
- {
- cout<<"set socket error..."<<endl;
- return false;
- }
- if(bind(sock,(struct sockaddr *)&(addrto), sizeof(struct sockaddr_in)) == -1)
- {
- cout<<"bind error..."<<endl;
- return false;
- }
- int len = sizeof(sockaddr_in);
- char smsg[100] = {0};
- while(1)
- {
- //从广播地址接受消息
- int ret=recvfrom(sock, smsg, 100, 0, (struct sockaddr*)&from,(socklen_t*)&len);
- if(ret<=0)
- {
- cout<<"read error...."<<sock<<endl;
- }
- else
- {
- printf("%s\t", smsg);
- }
- sleep(1);
- }
- return 0;
- }
// 接收端 http://blog.csdn.net/robertkun#include <iostream>#include <stdio.h>#include <sys/socket.h>#include <unistd.h>#include <sys/types.h>#include <netdb.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>using namespace std;int main(){setvbuf(stdout, NULL, _IONBF, 0); fflush(stdout); // 绑定地址struct sockaddr_in addrto;bzero(&addrto, sizeof(struct sockaddr_in));addrto.sin_family = AF_INET;addrto.sin_addr.s_addr = htonl(INADDR_ANY);addrto.sin_port = htons(6000);// 广播地址struct sockaddr_in from;bzero(&from, sizeof(struct sockaddr_in));from.sin_family = AF_INET;from.sin_addr.s_addr = htonl(INADDR_ANY);from.sin_port = htons(6000);int sock = -1;if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { cout<<"socket error"<<endl;return false;} const int opt = 1;//设置该套接字为广播类型,int nb = 0;nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));if(nb == -1){cout<<"set socket error..."<<endl;return false;}if(bind(sock,(struct sockaddr *)&(addrto), sizeof(struct sockaddr_in)) == -1) { cout<<"bind error..."<<endl;return false;}int len = sizeof(sockaddr_in);char smsg[100] = {0};while(1){//从广播地址接受消息int ret=recvfrom(sock, smsg, 100, 0, (struct sockaddr*)&from,(socklen_t*)&len);if(ret<=0){cout<<"read error...."<<sock<<endl;}else{printf("%s\t", smsg);}sleep(1);}return 0;}
自已在Linux虚拟机下测试可以成功, 前提是要把主机设置在同一网段内, 还有就是不要忘记关闭Linux的防火墙.. 可以使用setup命令进行设置。
(我在测试的时候只能发送不收接收,折磨了我半天,后来才想到是Linux防火墙的问题。。)
关于虚拟机的网卡配置,建议选择桥接模式。NAT的模式的话,是受限制的,可能会收不到广播消息。
具体的参考网上的文章吧。。
祝你成功。。
- Linux系统下UDP发送和接收广播消息小例子
- Linux系统下UDP发送和接收广播消息小例子
- Linux系统下UDP发送和接收广播消息小例子
- Linux系统下UDP发送和接收广播消息小例子
- Linux系统下UDP发送和接收广播消息小例子
- Linux系统下UDP发送和接收广播消息小例子
- Linux系统下UDP发送和接收广播消息小例子
- 局域网下UDP广播发送与接收
- Linux下UDP的组播接收和发送的简单例子
- Android发送和接收UDP广播
- 使用UDP发送和接收消息
- udp发送和接收消息,服务端
- JAVA之UDP广播接收与发送小程序
- qt 下UDP消息的接收和发送和TCP发送文件
- Linux下组播&广播消息小例子
- C语言socket UDP广播的发送和接收示例
- 发送广播和接收广播
- 接收和发送广播
- iOS 7人机交互指南-Icon和Image设计-Launch Images
- 血泪史:七种IT失误让你直接走人
- 为什么C++编译器不能支持对模板的分离式编译
- ORACLE WITH AS 的用法
- Spring:JdbcTemplate 使用指南
- Linux系统下UDP发送和接收广播消息小例子
- 一个在清华附近蹲了17年的男人
- 关于Gson的一般用法及常见问题的解决方案
- android_Mediaplayer&audiotrack MediaRecord&audiorecord
- linux设置启动模式
- 日本人为什么不创业?
- Linux 存储设备的表示方法和永久挂载分区的方法【含相关命令】
- 项目分析(spring+hibernate+velocity)(二)
- IT界那些性感的让人尖叫的程序员