setsockopt设置socket广播选项
例:
发送广播报文代码如下:
mysendto.c
#include <sys/types.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { if(3 > argc) { fprintf(stderr, "Usage: %s <ipaddr> <port>\n", argv[0]); exit(1); } int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); if(-1 == sock_fd) { perror("create socket"); exit(2); } struct sockaddr_in to; to.sin_family = AF_INET; to.sin_port = htons(atoi(argv[2])); to.sin_addr.s_addr = inet_addr(argv[1]); int broad_flag = 1; setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, &broad_flag, sizeof(int)); char *str = "hello world."; if(argc >= 4) { str = argv[3]; } /* int normal_fd; if(-1 == (normal = open(argv[3],RD_ONLY))) { perror("open()"); exit(3); } */ int packet_num = 0; while(1) { int ret = sendto(sock_fd, str, strlen(str)+1, 0, (struct sockaddr*)&to,sizeof(struct sockaddr_in)); if(-1 == ret) { perror("sendto"); exit(2); } printf("broad %d packets.\n", ++packet_num); sleep(1); } close(sock_fd); }
接收报文代码如下:
myrecvfrom.c
#include <sys/types.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #define PORT_NUM 12345 /* *recv data and dump to dsp */ int main(int argc, char *argv[]) { char buf[1024]; struct sockaddr_in sendaddr; int recv_len = sizeof(struct sockaddr_in); struct sockaddr_in myaddr; myaddr.sin_family = AF_INET; myaddr.sin_port = htons(PORT_NUM); myaddr.sin_addr.s_addr = htonl(INADDR_ANY); int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); if(-1 == sock_fd) { perror("create socket"); exit(2); } int ret = bind(sock_fd, (struct sockaddr *)&myaddr, sizeof(struct sockaddr_in)); if(-1 == ret) { perror("bind"); exit(3); } while(1) { ret = recvfrom(sock_fd, buf, sizeof(buf), 0, (struct sockaddr*)&sendaddr, &recv_len); if(-1 == ret) { perror("recv"); exit(4); } printf("recv data from address: %s data: %s\n", inet_ntoa(sendaddr.sin_addr), buf); } close(sock_fd); }
编译链接后, 在两个终端分别运行输出如下:
上图第二次运行" ./mysendto 192.168.1.255 12345 abcdefg"输出"sendto Permission denied", 是在屏蔽"
setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, &broad_flag, sizeof(int));
"后运行的结果