>운영 및 유지보수 >리눅스 운영 및 유지 관리 >리눅스 들어봐 그게 무슨 뜻이야

리눅스 들어봐 그게 무슨 뜻이야

藏色散人
藏色散人원래의
2023-04-21 10:58:082412검색

Linux 청취는 수신을 의미하며 수신은 클라이언트의 TCP 소켓에서 연결 요청을 모니터링하는 것을 의미합니다. 수신 함수는 일반적으로 바인딩을 호출한 후 수락을 호출하기 전에 호출됩니다. .

리눅스 들어봐 그게 무슨 뜻이야

이 튜토리얼의 운영 환경: linux5.9.8 시스템, Dell G3 컴퓨터.

linux 듣기 무슨 뜻인가요?

Linux

listen 함수는 클라이언트의 tcp 소켓에서 연결 요청을 수신합니다.

listen 함수는 일반적으로 바인딩을 호출한 후 호출됩니다. 해당 함수 프로토타입은 다음과 같습니다.

#include<sys/socket.h>  
int listen  (  int sockfd,  int backlog  )
매개변수 sockfd는 청취 기능에 의해 작동되는 소켓입니다. 매개변수 backlog는 청취 대기열의 길이입니다. 연결 요청을 처리하는 동안 다른 연결 요청이 있을 수 있습니다. TCP 연결은 프로세스이기 때문에 동시에 연결을 시도하는 사용자가 너무 많아 서버 프로세스가 연결 요청을 빠르게 완료하지 못하는 경우가 있습니다. 이러한 상황이 발생하면 서버 프로세스는 커널이 이를 어떻게 처리하기를 원합니까? 커널은 완료된 연결을 추적하기 위해 자체 프로세스 공간에 대기열을 유지하지만 서버 프로세스가 아직 연결을 인수하지 않았습니다(아직 승인 기능을 호출하지 않은 연결). 커널은 이러한 대기열을 임의로 크게 만들 수 없습니다. 그래서 크기에 상한선이 있어야 합니다. 이 백로그는 커널에 이 값을 상한값으로 사용하도록 지시합니다.
반환 값0 설정 여부

Success

Failure

errno

−1

is

오류 메시지:

EADDRINUSE: 다른 소켓도 동일한 포트에서 수신 대기 중입니다. EBADF: sockfd 매개변수는 잘못된 파일 설명자입니다.

ENOTSOCK: sockfd 매개변수는 파일 설명자가 아닙니다.

EOPNOTSUPP: 소켓 유형이 수신 작업을 지원하지 않습니다.


예:

#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 비디오 튜토리얼

"

위 내용은 리눅스 들어봐 그게 무슨 뜻이야의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.