#include #include #include #include #include #include #include #include #include #define MAXHOSTNAMELEN 128 int open_listen(int port) { int fd; struct sockaddr_in serverAddr; int optVal; /* Create socket */ fd = socket(AF_INET, SOCK_STREAM, 0); if(fd < 0) { perror("Error creating socket"); exit(1); } /* Set socket option to allow port number to be reused immediately */ optVal = 1; if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(int)) < 0) { perror("Error setting socket option"); exit(1); } /* Populate the address structure with the address that the server will * listen on */ serverAddr.sin_family = AF_INET; /* IP v4 */ serverAddr.sin_port = htons(port); /* port number - in network byte order */ serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any IP address for this ** machine */ /* Bind fd to that address we've just created */ if(bind(fd, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr_in)) < 0){ perror("Error binding socket to port"); exit(1); } /* Start listening on that socket */ /* SOMAXCONN = max requests that we'll queue */ if(listen(fd, SOMAXCONN) < 0) { perror("Error listening"); exit(1); } return fd; } /* Converts buffer of characters to upper case */ char* capitalise(char* buffer, int len) { int i; for(i=0; i 0) { capitalise(buffer, numBytesRead); write(fd, buffer, numBytesRead); } if(numBytesRead < 0) { perror("Error reading from socket"); exit(1); } printf("Done\n"); fflush(stdout); /* Close server end of the connection */ close(fd); } } 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]); /* Check port number is valid */ if(portnum < 1024 || portnum > 65535) { fprintf(stderr, "Invalid port number: %s\n", argv[1]); exit(1); } /* Start listening on that port */ fdServer = open_listen(portnum); process_connections(fdServer); return 0; }