#include #include #include #include #include #include #include #include #include #include #include #include int readn(int socket_fd, unsigned char *ptr, int len); int main(int argc, char *argv[]) { struct sockaddr_in serv_sock_addr, client_sock_addr; int cli_addrlen, socket_fd, socket_fd2; unsigned char data; int port_number; if (argc != 2) { printf("Usage: tcp_server \n"); exit(1); } port_number = atoi(argv[1]); if (port_number < 1024) { printf("Invalid port number. Port < 1024. Aborting ...\n"); exit(1); } if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) exit(1); bzero((char *) &serv_sock_addr, sizeof(serv_sock_addr)); serv_sock_addr.sin_family = AF_INET; serv_sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_sock_addr.sin_port = htons((short)port_number); if (bind(socket_fd, (struct sockaddr *) &serv_sock_addr, sizeof(serv_sock_addr)) < 0) exit(1); listen(socket_fd, 5); cli_addrlen = sizeof(client_sock_addr); socket_fd2 = accept(socket_fd, (struct sockaddr *) &client_sock_addr, &cli_addrlen); if (socket_fd2 < 0) exit(1); while (1) { read(socket_fd2, &data, 1); if (data == 0) { close(socket_fd2); break; } else write(socket_fd2, &data, 1); } close(socket_fd); } int readn(int socket_fd, unsigned char *ptr, int len) { int remaining, read_size; remaining = len; while (remaining > 0) { read_size = read(socket_fd, ptr, remaining); if (read_size < 0) return(read_size); else if (read_size == 0) break; remaining -= read_size; ptr += read_size; } return(len - remaining); }