Maison  >  Article  >  Opération et maintenance  >  Linux écoute qu'est-ce que ça veut dire

Linux écoute qu'est-ce que ça veut dire

藏色散人
藏色散人original
2023-04-21 10:58:082325parcourir

Linux Listen signifie écouter, et Listen fait référence à la surveillance de la demande de connexion depuis le socket TCP du client ; la fonction d'écoute est généralement appelée après avoir appelé bind et avant d'appeler accept. Son prototype de fonction est "int Listen (int sockfd, int backlog)". .

Linux écoute qu'est-ce que ça veut dire

L'environnement d'exploitation de ce tutoriel : système linux5.9.8, ordinateur Dell G3.

linux écoute Qu'est-ce que ça veut dire ?

fonction d'écoute sous Linux

écoute les demandes de connexion du socket TCP du client

la fonction d'écoute est généralement appelée après l'appel de bind - avant d'appeler accept Son prototype de fonction est :

#include<sys/socket.h>  
int listen  (  int sockfd,  int backlog  )
Le paramètre. sockfd est le socket sur lequel agit la fonction d'écoute. Le paramètre backlog est la longueur de la file d'attente d'écoute. Pendant que le processus traite une demande de connexion, il peut y avoir d'autres demandes de connexion. La connexion TCP étant un processus, il peut y avoir un état semi-connecté. Parfois, en raison d'un trop grand nombre d'utilisateurs essayant de se connecter en même temps, le processus serveur ne peut pas terminer rapidement la demande de connexion. Si cette situation se produit, comment le processus serveur souhaite-t-il que le noyau la gère ? Le noyau maintiendra une file d'attente dans son propre espace de processus pour suivre ces connexions terminées, mais le processus serveur n'a pas encore pris en charge la connexion (la connexion qui n'a pas encore appelé la fonction d'acceptation). Le noyau ne peut pas rendre une telle file d'attente arbitrairement grande. il doit donc y avoir une limite supérieure de taille. Cet arriéré indique au noyau d'utiliser cette valeur comme limite supérieure.
Valeur de retour0

Succès

Échec

S'il faut définir le numéro d'erreur

−1

est

Message d'erreur :

EADDRINUSE : Une autre socket est également en écoute sur le même port. EBADF : Le paramètre sockfd est un descripteur de fichier illégal.

ENOTSOCK : Le paramètre sockfd n'est pas un descripteur de fichier.

EOPNOTSUPP : Le type de socket ne prend pas en charge l'opération d'écoute.


Exemple :

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
int main()
{
int sockfd,new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
//建立TCP套接口
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("create socket error");
perror("socket");
exit(1);
}
//初始化结构体,并绑定2323端口
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(2323);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
//绑定套接口
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind socket error");
exit(1);
}
//创建监听套接口  监听队列长度为10
if(listen(sockfd,10)==-1)
{
perror("listen");
exit(1);
}

//等待连接
while(1)
{
sin_size = sizeof(struct sockaddr_in);

printf("server is run./n");
//如果建立连接,将产生一个全新的套接字
if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1)
{
perror("accept");
exit(1);
}
printf("accept success./n");
//生成一个子进程来完成和客户端的会话,父进程继续监听
if(!fork())
{
printf("create new thred success./n");
//读取客户端发来的信息
int numbytes;
char buff[256];
memset(buff,0,256);
if((numbytes = recv(new_fd,buff,sizeof(buff),0))==-1)
{
perror("recv");
exit(1);
}
printf("%s",buff);
//将从客户端接收到的信息再发回客户端
if(send(new_fd,buff,strlen(buff),0)==-1)
perror("send");
close(new_fd);
exit(0);
}
close(new_fd);
}
close(sockfd);
}

#include <stdio.h>
#include <stdlib.h>

#include <string.h>
#include <netdb.h>
#include <sys/types.h>

#include <sys/socket.h>

int main(int argc,char *argv[])
{

int sockfd,numbytes;
char buf[100];

struct sockaddr_in their_addr;
//int i = 0;
//将基本名字和地址转换


//he = gethostbyname(argv[1]);

//建立一个TCP套接口
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
printf("create socket error.建立一个TCP套接口失败");
exit(1);
}
//初始化结构体,连接到服务器的2323端口
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(2323);
// their_addr.sin_addr = *((struct in_addr *)he->h_addr);
inet_aton( "127.0.0.1", &their_addr.sin_addr );


bzero(&(their_addr.sin_zero),8);
//和服务器建立连接
if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)
{
perror("connect");
exit(1);
}
//向服务器发送数据
if(send(sockfd,"hello!socket.",6,0)==-1)
{
perror("send");
exit(1);
}
//接受从服务器返回的信息
if((numbytes = recv(sockfd,buf,100,0))==-1)
{
perror("recv");
exit(1);
}
buf[numbytes] = &#39;/0&#39;;
printf("Recive from server:%s",buf);
//关闭socket
close(sockfd);

return 0;
}
Apprentissage recommandé : "Tutoriel vidéo Linux

"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn