/* File : tcp_uppercase_echo_server.c Programmer : Nasif Ekiz Date : Description : This is the server side of a TCP client/server application where the client sends a message to the server and server responds with an modified echo message where the incomming message is converted to all uppercase message. */ #include #include #include #include #include #include #include #include #define STRING_SIZE 1024 #define SERV_TCP_PORT 6500 int main(void) { int sock_server; // socket identifier of server's listening socket int sock_connection; // socket identifier of server's data send/recv socket struct sockaddr_in server_addr; // address structure to keep server's IPv4 address info unsigned int server_addr_len; // length of the server's address structure unsigned short server_port; // server application port number struct sockaddr_in client_addr; // address structure to keep client's IPv4 address info unsigned int client_addr_len; // length of the client's address structure char sentence[STRING_SIZE]; // message received from client char modifiedSentence[STRING_SIZE]; // modified message send to client unsigned int msg_len; // message length int bytes_sent, bytes_recd; // number of bytes sent and received unsigned int i; // loop variable /* open a socket AF_INET : IPv4 protocol SOCK_STREAM : stream socket IPPROTO_TCP : TCP transport protocol */ if ((sock_server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { perror("Server : can't open stream socket"); exit(1); } // initialize server address information memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* in the case of multiple interfaces accept connection on any host interface */ server_port = SERV_TCP_PORT; // server application port number server_addr.sin_port = htons(server_port); // convert port number from host byte // order to network byte order and assign to // server's port number // bind the socket to the local server port if (bind(sock_server, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) { perror("Server : can't bind to local address"); close(sock_server); exit(1); } // listen for incomming requests from clients if (listen(sock_server, 50) < 0) { perror("Server : error on listen"); close(sock_server); exit(1); } printf("I am here to listen ... on port %hu\n\n", SERV_TCP_PORT); client_addr_len = sizeof(client_addr); // length of client address structure // wait for incomming connection requests in an indefinite loop for(;;) { /* The accept function blocks the server until a connection request comes from a client */ sock_connection = accept(sock_server, (struct sockaddr *) &client_addr, &client_addr_len); if (sock_connection < 0) { perror("Server : accept() error\n"); close(sock_server); exit(1); } // receive the message bytes_recd = recv(sock_connection, sentence, STRING_SIZE, 0); // message read successfully if (bytes_recd > 0) { // print the received message printf("Received Sentence is : \n"); printf("%s", sentence); printf("\nwith length %d\n\n", bytes_recd); // prepare the message to send msg_len = bytes_recd; // convert incomming message to all uppercase characters for(i=0; i < msg_len; i++) { modifiedSentence[i] = toupper(sentence[i]); } // send modified message to client bytes_sent = send(sock_connection, modifiedSentence, msg_len, 0); } // close the socket close(sock_connection); } }