Listen()和accept()系统调用 [英] Listen() and accept() system call

查看:114
本文介绍了Listen()和accept()系统调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经了解了listen调用的工作原理以及对其中使用的backlog参数的用法。但是我想看看这个(积压数量的队列)是如何在核心水平上运作的。



我尝试了什么:



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

推荐答案

关于这个主题的好读物是如何在Linux中使用TCP backlog [ ^ ]。



如果你想知道它是如何实现的,你必须阅读内核源代码(目录 net 与Linux)。
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).


这篇关于Listen()和accept()系统调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆