首頁 >運維 >linux運維 >linux listen 什麼意思

linux listen 什麼意思

藏色散人
藏色散人原創
2023-04-21 10:58:082412瀏覽

linux listen的意思是監聽,listen指的是監聽來自客戶端的tcp socket的連接請求;listen函數在一般在調用bind之後和調用accept之前調用,它的函數原型是“int listen  ( int sockfd,  int backlog)」。

linux listen 什麼意思

本教學操作環境:linux5.9.8系統、Dell G3電腦。

linux listen 什麼意思?

linux下listen函數

listen:監聽來自客戶端的tcp socket的連線請求

listen函數在一般在在呼叫bind之後-調用accept之前調用,它的函數原型是:

#include<sys/socket.h>  
int listen  (  int sockfd,  int backlog  )
參數sockfd是被listen函數作用的套接字
參數backlog是偵聽佇列的長度。  在進程正在處理一個連線請求的時候,可能還存在著其它的連線請求。因為TCP連線是一個過程,所以可能存在一種半連線的狀態,有時由於同時嘗試連線的使用者過多,使得伺服器進程無法快速完成連線要求。如果這個情況出現了,伺服器進程希望核心如何處理呢?內核會在自己的進程空間裡維護一個隊列以追蹤這些完成的連接但伺服器進程還沒有接手處理的連接(還沒有調用accept函數的連接),這樣的一個隊列內核不可能讓其任意大,所以必須有一個大小的上限。這個backlog告訴內核使用這個數值作為上限。
#0

# 傳回值

#成功

失敗

是否設定errno

−1




#錯誤訊息:

#EADDRINUSE:另一個socket也在監聽同一個連接埠。

EBADF:參數sockfd為非法的檔案描述子。
ENOTSOCK:參數sockfd不是檔案描述子。
EOPNOTSUPP:套接字類型不支援listen操作。
######實例:######
#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;
}
###推薦學習:《###linux影片教學###》############

以上是linux listen 什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn