I have read about how listen call works and what is use of backlog argument given into it. But I want to see how this (queue of number of backlog ) works at kernal level.
What I have tried:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#define BUF_SIZE 1024
int main(int argc,char *argv[])
{
int sfd,newsockfd,cli_len=0,ret,data_len;
struct sockaddr_in seraddr,cliaddr;
char buffer[BUF_SIZE];
char c_addr[256];
if(argc < 3)
{
printf("Execute it with command line arguments like:\n ./socket portid(i.e.9055) networkip(10.102.1.181)\n");
printf("Or for loop back ./socket portid(i.e.9055) networkip(0.0.0.0)\n");
return 1;
}
sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
perror("Error in socket\n");
close(sfd);
return;
}
printf("Socket Is Created\n");
seraddr.sin_family=AF_INET;
seraddr.sin_addr.s_addr=inet_addr(argv[2]);
seraddr.sin_port=htons(atoi(argv[1]));
memset(seraddr.sin_zero,'\0',sizeof(seraddr.sin_zero));
if(bind(sfd,(struct sockaddr *)&seraddr,sizeof(seraddr))<0)
{
perror("Error in bind");
close(sfd);
return;
}
printf("Bind Is Done\n");
listen(sfd,3);
printf("Listening..........\n");
while(1)
{
struct sockaddr_in cliaddr;
cli_len=sizeof (cliaddr);
newsockfd=accept(sfd,(struct sockaddr *)&cliaddr,&cli_len);
if(newsockfd<0)
{
perror("Error in accept\n");
exit(1);
}
inet_ntop(AF_INET, &(cliaddr.sin_addr), c_addr, sizeof(c_addr));
printf("COnnection from Port : %d and IP : %s\n",(int)(htons(cliaddr.sin_port)), c_addr);
while(1)
{
memset(buffer,0,BUF_SIZE);
data_len = recv(newsockfd,buffer,BUF_SIZE,0);
if(data_len < 0)
{
perror("Error in recv()\n");
}
printf("Received : %s\n",buffer);
printf("Reply to client : ");
fgets(buffer, BUF_SIZE, stdin);
send(newsockfd,buffer,BUF_SIZE,0);
}
printf("Client Is Closed\n");
close(newsockfd);
}
close(sfd);
}