Click here to Skip to main content
15,888,323 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
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:

/*
Exicute : 	gcc -o server inet4_server.c
			./server <portid> <networkid>
*/
#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);   
}
Posted
Updated 26-Apr-17 0:31am
v2
Comments
CHill60 26-Apr-17 6:19am    
Then run it and observe how it works.
What is your question?

1 solution

A good read about this topic is How TCP backlog works in Linux[^].

If you want to know how it is implemented you have to read the kernel sources (directory net with Linux).
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900