#include #include #include #include #include #include #include #include #include #include #define MAXHOSTNAMELEN 128 void* client_thread(void* arg); int open_listen(int port) { int fd; struct sockaddr_in serverAddr; int optVal; fd = socket(AF_INET, SOCK_STREAM, 0); if(fd < 0) { perror("Error creating socket"); exit(1); } optVal = 1; if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(int)) < 0) { perror("Error setting socket option"); exit(1); } serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(fd, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr_in)) < 0){ perror("Error binding socket to port"); exit(1); } if(listen(fd, SOMAXCONN) < 0) { perror("Error listening"); exit(1); } return fd; } char* capitalise(char* buffer, int len) { int i; for(i=0; i 0) { capitalise(buffer, numBytesRead); write(fd, buffer, numBytesRead); } /* EOF or error */ if(numBytesRead < 0) { perror("Error reading from socket"); exit(1); } printf("Done\n"); fflush(stdout); close(fd); /* pthread_exit(NULL); - don't really need this - * next line does the same */ return NULL; } int main(int argc, char* argv[]) { int portnum; int fdServer; if(argc != 2) { fprintf(stderr, "Usage: %s port-num\n", argv[0]); exit(1); } portnum = atoi(argv[1]); if(portnum < 1024 || portnum > 65535) { fprintf(stderr, "Invalid port number: %s\n", argv[1]); exit(1); } fdServer = open_listen(portnum); process_connections(fdServer); return 0; }