2022-08-18
場景
存在兩個角色,一個是“發佈者”,另一個是“訂閱者”。雙方均處於同一局域網。發佈者定時向局域網內所有主機發布消息,訂閱者負責接收這一消息。
實現
在linux環境下,使用C語言基於UDP的廣播來實現是最便捷的。並且在同一局域網內幾乎不用擔心UDP的通信可靠性問題。
發佈者示例程序
#include <stdio.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <unistd.h> int main() { printf("hello world\n"); struct sockaddr_in sin; int sfd; sfd = socket(AF_INET, SOCK_DGRAM, 0); printf("UDP socket fd:%d\n", sfd); int sb = 1; int ret = setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &sb, sizeof(int)); //打開廣播通信的權限 printf("set sock opt ret:%d\n", ret); memset(&sin, 0, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_port = htons(8611); //通信端口號。發佈者與訂閱者必須一致。 sin.sin_addr.s_addr = htonl(INADDR_BROADCAST); printf("config IP-address success\n"); char* words = "hi there\n"; int slen; while(1) { slen = sendto(sfd, words, strlen(words), 0, (struct sockaddr*)&sin, sizeof(sin)); printf("%s sent %d\n", words, slen); sleep(3); } return 0; }
訂閱者示例程序
#include <stdio.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <unistd.h> int main() { struct sockaddr_in sin; int sfd; int ret; sfd = socket(AF_INET, SOCK_DGRAM, 0); printf("socket fd:%d\n", sfd); int sb = 1; ret = setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &sb, sizeof(int)); //The permission printf("set sock opt ret:%d\n", ret); sin.sin_addr.s_addr = htonl(INADDR_BROADCAST); //255.255.255.255 sin.sin_family = AF_INET; sin.sin_port = htons(8611); //Very important ret = bind(sfd, (struct sockaddr*)&sin, sizeof(sin)); printf("bind ret:%d\n", ret); char rbuf[256]; int rlen; while(1) { rlen = recvfrom(sfd, rbuf, 255, 0, NULL, NULL); rbuf[rlen] = 0; printf("rlen:%d, %s\n", rlen, rbuf); } return 0; }