1 #include <sys/socket.h> 2 #include <netinet/in.h> 3 #include <strings.h> 4 #include <string.h> 5 #include <err.h> 6 7 int 8 main(int argc, char **argv) 9 { 10 struct sockaddr_in addr1, addr2; 11 int fd1, fd2, enable = 1; 12 13 addr1.sin_family = AF_INET; 14 addr1.sin_port = htons(6666); 15 addr1.sin_addr.s_addr = INADDR_ANY; 16 /* fill sin_zero explicitly with garbage */ 17 memset(addr1.sin_zero, 0xd0, sizeof(addr1.sin_zero)); 18 19 addr2.sin_family = AF_INET; 20 addr2.sin_port = htons(6666); 21 addr2.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 22 /* fill sin_zero explicitly with garbage */ 23 memset(addr2.sin_zero, 0xd0, sizeof(addr2.sin_zero)); 24 25 26 if ((fd1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) 27 err(1, "socket1"); 28 29 if (setsockopt(fd1, SOL_SOCKET, SO_REUSEPORT, &enable, 30 sizeof(int)) < 0) 31 err(1, "setsockopt1"); 32 33 if (bind(fd1, (struct sockaddr *)&addr1, sizeof(addr1)) == -1) 34 err(1, "bind1"); 35 36 if ((fd2 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) 37 err(1, "socket1"); 38 39 if (setsockopt(fd2, SOL_SOCKET, SO_REUSEPORT, &enable, 40 sizeof(int)) < 0) 41 err(1, "setsockopt2"); 42 43 if (bind(fd2, (struct sockaddr *)&addr2, sizeof(addr2)) == -1) 44 err(1, "bind2"); 45 46 return 0; 47 } 48