广播是在局域网之间的一对多的通信方式,使用的udp协议
/*** client.c ***/ #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h>#define SERVER_PORT 8000 #define MAXLINE 4096 #define CLIENT_PORT 9000int main(int argc, char *argv[]) {struct sockaddr_in localaddr;int confd;ssize_t len;char buf[MAXLINE];//1.创建一个socketconfd = socket(AF_INET, SOCK_DGRAM, 0);//2.初始化本地端地址bzero(&localaddr, sizeof(localaddr));localaddr.sin_family = AF_INET;inet_pton(AF_INET, "0.0.0.0" , &localaddr.sin_addr.s_addr);localaddr.sin_port = htons(CLIENT_PORT);int ret = bind(confd, (struct sockaddr *)&localaddr, sizeof(localaddr)); //显示绑定不能省略if (ret == 0)printf("...bind ok...\n");while (1) {len = recvfrom(confd, buf, sizeof(buf), 0, NULL, 0);write(STDOUT_FILENO, buf, len);}close(confd);return 0; }
/*** server.c ***/ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/socket.h> #include <string.h> #include <arpa/inet.h> #include <net/if.h>#define SERVER_PORT 8000 /* 无关紧要 */ #define MAXLINE 1500#define BROADCAST_IP "192.168.42.255" #define CLIENT_PORT 9000 /* 重要 */int main(void) {int sockfd;struct sockaddr_in serveraddr, clientaddr;char buf[MAXLINE];/* 构造用于UDP通信的套接字 */sockfd = socket(AF_INET, SOCK_DGRAM, 0);bzero(&serveraddr, sizeof(serveraddr));serveraddr.sin_family = AF_INET; /* IPv4 */serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); /* 本地任意IP INADDR_ANY = 0 */serveraddr.sin_port = htons(SERVER_PORT);bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));int flag = 1;setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &flag, sizeof(flag));/*构造 client 地址 IP+端口 192.168.7.255+9000 */bzero(&clientaddr, sizeof(clientaddr));clientaddr.sin_family = AF_INET;inet_pton(AF_INET, BROADCAST_IP, &clientaddr.sin_addr.s_addr);clientaddr.sin_port = htons(CLIENT_PORT);int i = 0;while (1) {sprintf(buf, "Drink %d glasses of water\n", i++);//fgets(buf, sizeof(buf), stdin);sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&clientaddr, sizeof(clientaddr));sleep(1);}close(sockfd);return 0; }