// SERWER #include #include #include #include #include #include #include #include #include #include #include #include typedef struct sockaddr SockAddr; typedef struct sockaddr_in SockAddr_in; typedef struct sockaddr_in6 SockAddr_in6; void handle_error(char *txt) { perror(txt); exit(-1); } int main() { fd_set set; FD_ZERO(&set); SockAddr_in adres4; SockAddr_in6 adres6; int gniazdo2; socklen_t rozmiar4 = sizeof(SockAddr_in); socklen_t rozmiar6 = sizeof(SockAddr_in6); int sock6, sock4; if ((sock6 = socket(AF_INET6, SOCK_STREAM, 0)) == -1) handle_error("socket - 6"); if ((sock4 = socket(AF_INET, SOCK_STREAM, 0)) == -1) handle_error("socket - 4"); int max; max = (sock4 < sock6 ? sock6 : sock4); memset(&adres4, 0, sizeof(SockAddr_in)); memset(&adres6, 0, sizeof(SockAddr_in6)); adres6.sin6_family = AF_INET6; adres4.sin_family = AF_INET; adres4.sin_port = htons(4040); adres6.sin6_port = htons(4041); inet_pton(AF_INET, "127.0.0.1", &adres4.sin_addr.s_addr); inet_pton(AF_INET6, "::1", &adres6.sin6_addr.s6_addr); if (bind(sock4, (SockAddr *)&adres4, rozmiar4) == -1) handle_error("bind - 4"); if (bind(sock6, (SockAddr *)&adres6, rozmiar6) == -1) handle_error("bind sock 6"); if (listen(sock4, 5) == -1) handle_error("listen - 4"); if (listen(sock6, 5) == -1) handle_error("listen - 4"); while (1) { FD_SET(sock4, &set); FD_SET(sock6, &set); select(max + 1, &set, NULL, NULL, NULL); if (FD_ISSET(sock4, &set)) { gniazdo2 = accept(sock4, (SockAddr *)&adres4, &rozmiar4); } else if (FD_ISSET(sock6, &set)) { gniazdo2 = accept(sock6, (SockAddr *)&adres6, &rozmiar6); } int i; if ((i = fork()) == -1) { handle_error("fork"); } else if (i == 0) { pid_t pid; ssize_t liczbaBajtow; if ((liczbaBajtow = read(gniazdo2, &pid, sizeof(pid_t))) == -1) handle_error("read"); printf("%d %d\n", liczbaBajtow, pid); } else { sigignore(SIGCHLD); } } return 0; }