Linux系统下UDP发送和接收广播消息小例子
生活随笔
收集整理的這篇文章主要介紹了
Linux系统下UDP发送和接收广播消息小例子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
分類: 網絡通信 2013-01-07 10:54 1336人閱讀 評論(6) 收藏 舉報
[cpp] view plaincopyprint? //?發送端 ?? #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;
}
?
[cpp] view plaincopyprint?
自已在Linux虛擬機下測試可以成功, 前提是要把主機設置在同一網段內, 還有就是不要忘記關閉Linux的防火墻.. 可以使用setup命令進行設置。
(我在測試的時候只能發送不收接收,折磨了我半天,后來才想到是Linux防火墻的問題。。)
?
關于虛擬機的網卡配置,建議選擇橋接模式。NAT的模式的話,是受限制的,可能會收不到廣播消息。
具體的參考網上的文章吧。。
祝你成功。。
總結
以上是生活随笔為你收集整理的Linux系统下UDP发送和接收广播消息小例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker hub上镜像手动下载_Do
- 下一篇: 一个(伪)MaterialDesign风