/* Simple program to demonstrate a UDP-based server. * Loops forever. Receives a word from a client. * Sends back the length of that word to the client. * * Compile using "cc -o wordlen-server wordlen-server.c" * * Written by Carey Williamson, February 2022. */ /* Include files */ #include #include #include #include #include #include /* Manifest constants */ #define MAX_LENGTH 40 #define PORT 44101 /* Verbose debugging */ /* #define DEBUG 1 */ /* Main program */ int main() { struct sockaddr_in si_server, si_client; struct sockaddr *server, *client; int s, i, len; char messagein[MAX_LENGTH], messageout[MAX_LENGTH]; int bytesin, bytesout; s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if( s < 0) { printf("wordlen-server: socket() call failed!\n"); return -1; } memset((char *) &si_server, 0, sizeof(si_server)); si_server.sin_family = AF_INET; si_server.sin_port = htons(PORT); si_server.sin_addr.s_addr = htonl(INADDR_ANY); server = (struct sockaddr *) &si_server; client = (struct sockaddr *) &si_client; len=sizeof(si_server); if( bind(s, server, sizeof(si_server)) < 0 ) { printf("wordlen-server: bind() to port %d failed!\n", PORT); return -1; } printf("Welcome! I am the UDP-based word length server!!\n"); printf("server now listening on UDP port %d...\n", PORT); /* big loop, looking for incoming messages from clients */ for( ; ; ) { /* clear out message buffers to be safe */ bzero(messagein, MAX_LENGTH); bzero(messageout, MAX_LENGTH); /* see what comes in from a client, if anything */ bytesin = recvfrom(s, messagein, MAX_LENGTH, 0, client, &len); if( bytesin < 0 ) { printf("wordlen-server: recvfrom() failed!\n"); return -1; } #ifdef DEBUG else printf("Word length server received %d bytes from a client\n", bytesin); #endif printf(" server received \"%s\" from IP %s port %d\n", messagein, inet_ntoa(si_client.sin_addr), ntohs(si_client.sin_port)); #ifdef DEBUG printf("server thinks that word has %d characters...\n", strlen(messagein)); #endif /* create the outgoing message (as an ASCII string) */ sprintf(messageout, "%d", strlen(messagein)); #ifdef DEBUG printf("Server sending back the message: \"%s\"\n", messageout); #endif /* send the result message back to the client */ bytesout = sendto(s, messageout, strlen(messageout), 0, client, len); if( bytesout < 0 ) printf("wordlen-server: sendto() failed!\n"); #ifdef DEBUG else printf("Word length server sent %d bytes back to that client\n", bytesout); #endif } close(s); return 0; }