我想在本地广播消息到许多应用程序。 为此,我认为UDP套接字是最好的IPC,纠正我,如果我worng。
为此,我使用以下代码:
对于广播:
/* ** broadcaster.c -- a datagram "client" that can broadcast */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define SERVERPORT 4950 // the port users will be connecting to int main(int argc,char *argv[]) { int sockfd; struct sockaddr_in their_addr; // connector's address @R_303_4045@ion struct hostent *he; int numbytes; int broadcast = 1; //char broadcast = '1'; // if that doesn't work,try this if (argc != 3) { fprintf(stderr,"usage: broadcaster hostname messagen"); exit(1); } if ((he=gethostbyname(argv[1])) == NULL) { // get the host info perror("gethostbyname"); exit(1); } if ((sockfd = socket(AF_UNIX,SOCK_DGRAM,0)) == -1) { perror("socket"); exit(1); } // this call is what allows broadcast packets to be sent: if (setsockopt(sockfd,SOL_SOCKET,SO_broADCAST,&broadcast,sizeof broadcast) == -1) { perror("setsockopt (SO_broADCAST)"); exit(1); } their_addr.sin_family = AF_UNIX; // host byte order their_addr.sin_port = htons(SERVERPORT); // short,network byte order their_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(their_addr.sin_zero,' ',sizeof their_addr.sin_zero); if ((numbytes=sendto(sockfd,argv[2],strlen(argv[2]),(struct sockaddr *)&their_addr,sizeof their_addr)) == -1) { perror("sendto"); exit(1); } printf("sent %d bytes to %sn",numbytes,inet_ntoa(their_addr.sin_addr)); close(sockfd); return 0; }
并听取:
即使有更多的cmsghdr对象,CMSG_NXTHDR()也会返回NULL
通过域套接字传输的单个数据包大小的实际限制是什么?
处理socket描述符如文件描述符(fstream)? C ++ / Linux的
Python 3.4多处理队列比pipe道更快,意外
/* ** listener.c -- a datagram sockets "server" demo */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define MYPORT "4950" // the port users will be connecting to #define MAXBUFLEN 100 // get sockaddr,IPv4 or IPv6: void *get_in_addr(struct sockaddr *sa) { if (sa->sa_family == AF_INET) { return &(((struct sockaddr_in*)sa)->sin_addr); } return &(((struct sockaddr_in6*)sa)->sin6_addr); } int main(void) { int sockfd; struct addrinfo hints,*servinfo,*p; int rv; int numbytes; struct sockaddr_storage their_addr; char buf[MAXBUFLEN]; socklen_t addr_len; char s[INET6_ADDRSTRLEN]; int optval = 1; memset(&hints,sizeof hints); hints.ai_family = AF_UNSPEC; // set to AF_INET to force IPv4 hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_PASSIVE; // use my IP if ((rv = getaddrinfo(NULL,MYPORT,&hints,&servinfo)) != 0) { fprintf(stderr,"getaddrinfo: %sn",gai_strerror(rv)); return 1; } // loop through all the results and bind to the first we can for(p = servinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family,p->ai_socktype,p->ai_protocol)) == -1) { perror("listener: socket"); continue; } if(setsockopt(sockfd,SO_REUSEADDR,&optval,sizeof optval) != 0) { perror("listener: setsockopt"); continue; } if (bind(sockfd,p->ai_addr,p->ai_addrlen) == -1) { close(sockfd); perror("listener: bind"); continue; } break; } if (p == NULL) { fprintf(stderr,"listener: Failed to bind socketn"); return 2; } freeaddrinfo(servinfo); printf("listener: waiting to recvfrom...n"); addr_len = sizeof their_addr; if ((numbytes = recvfrom(sockfd,buf,MAXBUFLEN-1,&addr_len)) == -1) { perror("recvfrom"); exit(1); } printf("listener: got packet from %sn",inet_ntop(their_addr.ss_family,get_in_addr((struct sockaddr *)&their_addr),s,sizeof s)); printf("listener: packet is %d bytes longn",numbytes); buf[numbytes] = ' '; printf("listener: packet contains "%s"n",buf); close(sockfd); return 0; }
问题是我必须通过这样的192.168.1.255的IP,但在真实情况下可能没有eth0接口,只会有环回。 那我怎么能做到这一点?
什么本地接口连接或数据包接收?
使用node.js连接到已经build立的UNIX套接字?
C- Unix套接字 – 非阻塞读取
在Windows上发送数据报时发生EACCES错误
服务器不应绑定到从getaddrinfo获得的地址,而应该绑定到127.255.255.255 (用于回送接口)。
有关广播服务器/客户端的现成示例,请参阅http://www.ccplusplus.com/2011/09/udp-broadcast-client-server-example.html
您可以在本地接口127.0.0.1上进行广播。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。