To
keep this program simple
- The server accepts connection from a single client only
- The server doesn't fork new process to handle client requst
- Client sends only a single message to server and server replies back with another message
Algorithm
Server- Create socket
- Bind
- Listen
- Accept connection
- Read data sent by client
- Send data back to client
- Close socket descriptors
- Create socket
- Connect to server
- Send data to server
- Receive data from server
- Close socket descriptors
Program
server#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define SERVERPORT 3098
#define SERVERIP "192.168.1.4"
#define SIZE 10
#define DEFAULT_FLAG 0
int main()
{
int sockfd, newsockfd, n;
int addrlen = sizeof(struct sockaddr_in);
struct sockaddr_in *serveraddr = (struct sockaddr_in *)malloc(addrlen);
struct sockaddr_in *clientaddr = (struct sockaddr_in *)malloc(addrlen);
char buff[10];
/* Create socket */
if((sockfd = socket(AF_INET, SOCK_STREAM, DEFAULT_FLAG))<0)
{
printf("Error: Socket creation failed... Exiting...\n");
return 0;
}
/* Bind */
bzero(serveraddr,addrlen); // Initailize serveraddr as null. defined in <string.h>
serveraddr->sin_family = AF_INET; // Set address family as INET
serveraddr->sin_port = SERVERPORT;
serveraddr->sin_addr.s_addr = inet_addr(SERVERIP); // Convert character string to dotted decimal format. Defined in <arpa/inet.h>
if(bind(sockfd, (struct sockaddr*) serveraddr, addrlen)<0)
{
printf("Error: Bind failed... Exiting...\n");
return 0;
}
/* listen */
listen(sockfd,4);
printf("Server waiting for connection request . . .\n");
/* Accept connection */
if((newsockfd = accept(sockfd, (struct sockaddr*)clientaddr, &addrlen))<0)
printf("Error: Accepting connection request failed\n");
else
printf("Connection Accepted \n");
/* Read data sent by client */
n = recv(newsockfd, buff, SIZE, DEFAULT_FLAG);
buff[n] = '\0';
printf("Message Received: %s\n",buff);
/* Send replt to client */
strcpy(buff,"Thank You");
send(newsockfd, buff, strlen(buff), DEFAULT_FLAG);
/* Close both socket descriptors*/
close(newsockfd);
close(sockfd);
return 0;
}
client
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define SERVERPORT 3098
#define SERVERIP "192.168.1.4"
#define SIZE 10
#define DEFAULT_FLAG 0
int main()
{
int sockfd,n;
int addrlen = sizeof(struct sockaddr_in);
struct sockaddr_in *serveraddr = (struct sockaddr_in *)malloc(addrlen);
char buff[10];
/* Create socket */
if((sockfd = socket(AF_INET, SOCK_STREAM, DEFAULT_FLAG))<0)
{
printf("Error: Socket creation failed... Exiting...\n");
return 0;
}
/* Connect to server */
bzero(serveraddr, addrlen); // Initailize serveraddr as null. defined in <string.h>
serveraddr->sin_family = AF_INET; // Set address family as INET
serveraddr->sin_port = SERVERPORT;
serveraddr->sin_addr.s_addr = inet_addr(SERVERIP); // Convert character string to dotted decimal format defined in <arpa/inet.h>
if(connect(sockfd, (struct sockaddr*)serveraddr, addrlen)<0)
{
printf("Error: Connection failed... Exiting...\n");
return 0;
}else
printf("Connection to server established successfully . . . \n");
/* Send data to Server */
printf("Enter Message to be sent ");
scanf("%s",buff);
send(sockfd, buff, strlen(buff), DEFAULT_FLAG);
/* Read reply from server */
n = recv(sockfd, buff, SIZE, DEFAULT_FLAG);
buff[n] = '\0';
printf("Message from Server: %s\n",buff);
/* Close socket descriptor */
close(sockfd);
return 0;
}
Output
server windowServer waiting for connection request . . .
Connection Accepted
Message Received: Welcome
client window
Connection to server established successfully . . .
Enter Message to be sent Welcome
Message from Server: Thank You