Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Linux, hören Sie, was es bedeutet

Linux, hören Sie, was es bedeutet

藏色散人
藏色散人Original
2023-04-21 10:58:082324Durchsuche

Linux bedeutet „Zuhören“, und „Listen“ bezieht sich auf das Abhören von Verbindungsanforderungen vom TCP-Socket des Clients. Die Listen-Funktion wird im Allgemeinen nach dem Aufruf von bind und vor dem Aufruf von „accept“ aufgerufen. Ihr Funktionsprototyp ist „int listen ( int sockfd, int backlog)“.

Linux, hören Sie, was es bedeutet

Die Betriebsumgebung dieses Tutorials: Linux5.9.8-System, Dell G3-Computer.

linux listen Was bedeutet das?

Listen-Funktion unter Linux

listen: Auf Verbindungsanfragen vom TCP-Socket des Clients warten#🎜🎜 #

Die Listen-Funktion wird normalerweise nach dem Aufruf von bind, aber vor dem Aufruf von Accept aufgerufen. Ihr Funktionsprototyp ist:

#include<sys/socket.h>  
int listen  (  int sockfd,  int backlog  )
Der Parameter sockfd wird vom Listen bearbeitet Funktion Socket
Der Parameter Backlog ist die Länge der Abhörwarteschlange.
Während der Prozess eine Verbindungsanfrage verarbeitet, können andere Verbindungsanfragen vorliegen. Da es sich bei der TCP-Verbindung um einen Prozess handelt, kann es vorkommen, dass der Serverprozess die Verbindungsanforderung nicht schnell abschließen kann, da zu viele Benutzer gleichzeitig versuchen, eine Verbindung herzustellen. Wenn diese Situation auftritt, wie möchte der Serverprozess, dass der Kernel damit umgeht? Der Kernel verwaltet eine Warteschlange in seinem eigenen Prozessraum, um diese abgeschlossenen Verbindungen zu verfolgen, aber der Serverprozess hat die Verbindung noch nicht übernommen (die Verbindung, die die Akzeptanzfunktion noch nicht aufgerufen hat). Der Kernel kann eine solche Warteschlange nicht beliebig groß machen. Daher muss es eine Obergrenze für die Größe geben. Dieser Rückstand weist den Kernel an, diesen Wert als Obergrenze zu verwenden.
#🎜🎜 # ErfolgFehlerOb Fehlernummer gesetzt werden soll0
Rückgabewert

# 🎜🎜#

−1

ist #🎜 🎜 #

Fehlermeldung:

EAD DRINUSE : Ein anderer Socket lauscht ebenfalls auf demselben Port. EBADF: Der Parameter sockfd ist ein illegaler Dateideskriptor. ENOTSOCK: Der Parameter sockfd ist kein Dateideskriptor.

EOPNOTSUPP: Der Socket-Typ unterstützt den Listen-Vorgang nicht.



Beispiel:

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

Empfohlenes Lernen: „Linux-Video-Tutorial

#🎜🎜 #

Das obige ist der detaillierte Inhalt vonLinux, hören Sie, was es bedeutet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn