Client-Server Chat using TCP in C

Saurabh Kushwah
Nov 1 · 3 min read

Client Server Interaction until one of them sends exit message to other.

Implementation in C using TCP

//Server.c
#include <netdb.h> 1
#include <netinet/in.h>
#include <stdlib.h> // for memory allocation and deallocation i.e Socket , open close
#include <stdio.h> // for basic file read and write i.e user input and display
#include <string.h> // for bzero() , strncmp ()
#include <sys/socket.h>
#include <sys/types.h>

#define MAX 80
#define PORT 8080
#define SA struct sockaddr // used for typecasting when bindinging

// Function designed for chat between client and server.
void chatFunc(int connfd)
{
char buff[MAX]; // to store message from client
int n; // for traversing buffer buff

// infinite loop for chat
for (;;) {

bzero(buff, MAX); // empties the buffer

// read the message from client and copy it in buffer
read(connfd, buff, sizeof(buff));

// print buffer which contains the client contents
printf("From client: %s\t To client : ", buff);

bzero(buff, MAX); // empties the buffer
n = 0;

// copy server message in the buffer
while ((buff[n++] = getchar()) != '\n') ;

// and send that buffer to client
write(connfd, buff, sizeof(buff)); // read from standard input until enter('\n') is encountered.

// if msg contains "Exit" then server exit and chat ended.
if (strncmp("exit", buff, 4) == 0) {
printf("Server Exit...\n");
break;
}
}
}

// Driver function
int main()
{
int sockfd, connfd, len; // create socket file descriptor
struct sockaddr_in servaddr, cli; // create structure object of sockaddr_in for client and server

// socket create and verification
sockfd = socket(AF_INET, SOCK_STREAM, 0); // creating a TCP socket ( SOCK_STREAM )

if (sockfd == -1) {
printf("Socket creation failed...\n");
exit(0);
}
else
printf("Socket successfully created..\n");

// empty the
bzero(&servaddr, sizeof(servaddr));

// assign IP, PORT
servaddr.sin_family = AF_INET; // specifies address family with IPv4 Protocol
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // binds to any address
servaddr.sin_port = htons(PORT); // binds to PORT specified

// Binding newly created socket to given IP and verification
if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) {
printf("socket bind failed...\n");
exit(0);
}
else
printf("Socket successfully binded..\n");

// Now server is ready to listen and verification
if ((listen(sockfd, 5)) != 0) {
printf("Listen failed...\n");
exit(0);
}
else
printf("Server listening..\n");

len = sizeof(cli);

// Accept the data packet from client and verification
connfd = accept(sockfd, (SA*)&cli, &len); // accepts connection from socket

if (connfd < 0) {
printf("server acccept failed...\n");
exit(0);
}
else
printf("server acccept the client...\n");

// Function for chatting between client and server
chatFunc(connfd);

// After chatting close the socket
close(sockfd);
}

Client.c

//Client.c
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>

#define MAX 80
#define PORT 8080
#define SA struct sockaddr
void func(int sockfd)
{
char buff[MAX];
int n;
for (;;) {
bzero(buff, sizeof(buff));
printf("Enter the string : ");
n = 0;
while ((buff[n++] = getchar()) != '\n')
;
write(sockfd, buff, sizeof(buff));
bzero(buff, sizeof(buff));
read(sockfd, buff, sizeof(buff));
printf("From Server : %s", buff);
if ((strncmp(buff, "exit", 4)) == 0) {
printf("Client Exit...\n");
break;
}
}
}

int main()
{
int sockfd;
struct sockaddr_in servaddr;

// socket create and varification
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
printf("Socket creation failed...\n");
exit(0);
}
else
printf("Socket successfully created..\n");

bzero(&servaddr, sizeof(servaddr));

// assign IP, PORT
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servaddr.sin_port = htons(PORT);

// connect the client socket to server socket
if (connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) != 0) {
printf("Connection with the server failed...\n");
exit(0);
}
else
printf("Connected to the server..\n");

// function for chat
func(sockfd);

// close the socket
close(sockfd);
}

Source Code

https://github.com/saurabh-kushwah/Practicals/tree/master/Computer%20Networks/Socket%20Programming%20in%20C/TCP%20-%20Hello%20Chat%20Program

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade