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;
}