In: Computer Science
I am trying to write a UDP socket program in which there is a server program and a client program. This is what I have but I can't figure out where I am going wrong.
This is the input and expected output:
> gcc udpclient.c –o clientout
> gcc udpserver.c –o serverout
> ./serverout 52007 ‘to celebrate’ &
> ./clientout odin 52007 ‘Today is a good day’
Today is a good day to celebrate
//UDP echo client program
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 52010
int main(int argc, char* argv[])      
           
        //Three arguments to be
checked later
{
   //Declare and define variables
   int s;      
           
           
        //Socket descriptor
   int len;       
           
           
    //Length of string to be echoed
   char* servName;       
           
            //Server
name
   int servPort;      
           
           
    //Server Port
   char* string;      
           
           
    //String to be echoed
   char buffer[256+1];      
           
            //Data
buffer
   struct sockaddr_in servAddr;  
           
            //Server
socket address
   //Check and set program arguments
   if(argc != 3)
   {
       printf("Error: three arguments are
needed!");
       exit(1);
   }
   servName = argv[1];
   servPort = atoi(argv[2]);
   string = argv[3];
   //Build server socket address
   memset(&servAddr, 0, sizeof(servAddr));
   servAddr.sin_family = AF_INET;
   inet_pton(AF_INET, servName,
&servAddr.sin_addr);
   servAddr.sin_port = htons(PORT);
   //Create socket
   if ((s = socket(PF_INET, SOCK_DGRAM, 0) <
0));
   {
       perror("Error: Socket
failed!");
       exit(1);
   }
   //Send echo string
   len = sendto(s, string, strlen(string), 0, (struct
sockaddr*)&servAddr, sizeof(servAddr));
   //Receive echo string
   recvfrom(s, buffer, len, 0, NULL, NULL);
   //Print and verify echoed string
   buffer[len] = '\0';
   printf("Echo string received: ");
   fputs(buffer, stdout);
   //Close the socket
   close(s);
   //Stop the program
   exit(0);
} //End of echo client program
//UDP echo server program
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 52010
int main(void)
{
   //Declare and define variables
   int s;       
           
            //Socket
descriptor(reference)
   int len;       
           
        //Length of string to be
echoed
   char buffer[256];      
           
    //Data buffer
   struct sockaddr_in servAddr;  
           
    //Server (local) socket address
   struct sockaddr_in clntAddr;  
           
    //Client (remote) socket address
   int clntAddrLen;      
           
    //Length of client socket address
   //Build local (server) socket address
   memset(&servAddr, 0,
sizeof(servAddr));      
        //Set socket structure to all
0
   servAddr.sin_family = AF_INET;  
           
    //Family field
   servAddr.sin_port = htons(PORT);  
            //Default
port number
   servAddr.sin_addr.s_addr =
htonl(INADDR_ANY);      
    //Default IP address
   //Create socket
   if((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
   {
       perror("Error: socket
failed!");
       exit(1);
   }
   //Bind socket to local address and port
   if((bind(s, (struct sockaddr*)&servAddr,
sizeof(servAddr))) < 0);
   {
       perror("Error: bind
failed!");
       exit(1);
   }
   for(;;)      
    //Run forever
   {
       //Receive String
       len = recvfrom(s, buffer,
sizeof(buffer), 0,
          
    (struct sockaddr*)&clntAddr,
&clntAddrLen);
       //Send String
       sendto(s, buffer, len, 0, (struct
sockaddr*)&clntAddr, sizeof(clntAddr));
   } //End of for loop
}//End of echo server program
// Server side implementation of UDP client-server model
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 8080
#define MAXLINE 1024
// Driver code
int main() {
int sockfd;
char buffer[MAXLINE];
char *celebrate = "celebrate from server";
struct sockaddr_in servaddr, cliaddr;
// Creating socket file descriptor
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
// Filling server information
servaddr.sin_family = AF_INET; // IPv4
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(PORT);
// Bind the socket with the server address
if ( bind(sockfd, (const struct sockaddr *)&servaddr,
sizeof(servaddr)) < 0 )
{
perror("bind failed");
exit(EXIT_FAILURE);
}
int len, n;
len = sizeof(cliaddr); //len is value/resuslt
n = recvfrom(sockfd, (char *)buffer, MAXLINE,
MSG_WAITALL, ( struct sockaddr *) &cliaddr,
&len);
buffer[n] = '\0';
printf("Client : %s\n", buffer);
sendto(sockfd, (const char *)celebrate, strlen(celebrate),
MSG_CONFIRM, (const struct sockaddr *) &cliaddr,
len);
printf("celebrate message sent.\n");
return 0;
}