#define _POSIX_SOURCE #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> /* gethostbyname */ #include <unistd.h> #include <string.h> #include <strings.h> /* dla bcopy */ #include <signal.h> #include <sys/wait.h> #define h_addr h_addr_list[0] struct my_msg { char *name; char text[255]; }; void reap_zombies(int sig) { while (waitpid(-1, NULL, WNOHANG) > 0) return; } int main(int argc, char *argv[]) { int sockfd, pid; struct sockaddr_in server_addr, client_addr; struct hostent *host; struct my_msg msg; int bindresult; ssize_t bytes; unsigned short n = 8888; char default_name[2] = "NN"; socklen_t clilen; signal(SIGCHLD, reap_zombies); host = gethostbyname(argv[1]); /*bcopy((char *)host->h_addr, (char *)&server_addr.sin_addr, host->h_length);*/ sockfd = socket(AF_INET, SOCK_DGRAM, 0); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(n); client_addr.sin_family = AF_INET; bcopy((char *)host->h_addr, (char *)&client_addr.sin_addr, host->h_length); /*client_addr.sin_addr.s_addr = inet_addr(argv[1]);*/ client_addr.sin_port = htons(n); bindresult = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); (bindresult == 0) ? "OK" : "blad tworzenia gniazda"); if (argc == 3) /*sscanf(argv[2], "%s", msg.name);*/ else /*sscanf(default_name, "%s", msg.name);*/ if ((pid = fork()) == 0) { while (1) { clilen = sizeof(client_addr); recvfrom(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&client_addr, &clilen); /*printf("\n[%s]> ", msg.name);*/ { write(1, "[", 2); write(1, "]> ", 4); /*free(msg.name); close(sockfd); exit(EXIT_FAILURE);*/ continue; /* serwer ma dalej dzialac, przeciez moze pojawic sie kolejny klient*/ } write(1, "[", 2); write(1, "]> ", 4); } } else { while (1) { bytes = sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&client_addr, sizeof(client_addr)); { kill(pid, SIGKILL); /* ubijam serwer, inaczej powstanie zombiak (reap_zombies tu nie zadziała, bo nigdzie fork nie robi exit)*/ break; } } } close(sockfd); return 0; }