#include #include #include #include #include #include #include #include #include #include int main(int argc, char * argv[]) { if (argc != 2) { fprintf(stderr, "usage: %s portnumber\n", argv[0]); exit(1); } int port_number = atoi(argv[1]); int namemax = sysconf(_SC_HOST_NAME_MAX); char * ourname = malloc(namemax + 1); gethostname(ourname, namemax); printf("%s, port %d\n", ourname, port_number); int serversocket = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in server_address; server_address.sin_len = sizeof(server_address); server_address.sin_family = AF_INET; server_address.sin_port = htons(port_number); server_address.sin_addr.s_addr = htonl(INADDR_ANY); int r = bind(serversocket, (struct sockaddr *) & server_address, sizeof(server_address)); if (r < 0) { perror("bind"); exit(1); } r = listen(serversocket, 3); if (r < 0) { perror("listen"); exit(1); } while (1) { struct sockaddr_in client_address; socklen_t slen; int clientsocket = accept(serversocket, (struct sockaddr *) & client_address, & slen); if (clientsocket < 0) { if (clientsocket == EINTR) continue; perror("accept"); exit(1); } printf("Accepted connection from %s port %d\n", inet_ntoa(client_address.sin_addr), ntohs(client_address.sin_port)); FILE * in = fdopen(clientsocket, "r"); FILE * out = fdopen(clientsocket, "w"); while (1) { char line[1000]; char * s = fgets(line, 1000, in); if (s == NULL) break; printf("%s", line); } fclose(out); fclose(in); close(clientsocket); } }