Linux 에서 프로 세 스 간 통신 방식 - UNIX Domain Socket

4842 단어 Nginx
리 눅 스 의 프로 세 스 통신 방식 은 매우 많 습 니 다. 전형 적 인 소켓 이 있 습 니 다. 평소에 자주 사용 하 는 소켓 은 TCP / IP 프로 토 콜 을 바탕 으로 하 는 것 입 니 다. 서로 다른 호스트 의 두 프로 세 스 간 통신 에 적 용 됩 니 다. 통신 하기 전에 IP 주 소 를 지정 해 야 합 니 다. 그러나 같은 호스트 의 두 프로 세 스 간 통신 용 소켓 이 있 으 면 ip 주 소 를 지정 해 야 합 니 다.너무 번거롭다. 이 럴 때 는 UDS 라 고 부 르 는 UNIX Domain Socket 을 사용 해 야 한다.  UDS 의 장점:
UDS 전송 은 네트워크 프로 토 콜 창 고 를 거치 지 않 아 도 되 고, 패키지 뜯 기 등의 조작 이 필요 없 으 며, 데이터 의 복사 과정 일 뿐 UDS 는 SOCK 로 나 뉜 다.STREAM (스 트림 소켓) 과 SOCKDGRAM (패 킷 소켓) 은 이 컴퓨터 에서 커 널 통신 을 통 해 패 키 지 를 잃 어 버 리 지 않 고 패 키 지 를 보 내 는 순서 와 패 키 지 를 받 는 순서 가 일치 하지 않 는 문제 프로 세 스 를 소개 합 니 다. Socket 에 익숙 하 다 면 UDS 도 같은 방식 입 니 다. 차이 점 은 다음 과 같 습 니 다.
UDS 는 IP 와 Port 가 필요 없 이 하나의 파일 이름 으로 domain 을 AF 로 표시 합 니 다.UNIX
UDS   sockaddr_un  
struct sockaddr_un {
    sa_family_t sun_family; /* AF_UNIX */
    char sun_path[UNIX_PATH_MAX];   /* pathname */
};

서버: socket - > bind - > listen - > accet - > recv / send - > close  클 라 이언 트: socket - > connect - > recv / send - > close
함수 소개 socket 만 들 기 시작
 int socket(int domain, int type, int protocol)
 domain( ) : AF_UNIX 
 type : SOCK_STREAM/ SOCK_DGRAM : 
 protocol : 0

SOCK_STREAM (흐름): 질서 있 고 신뢰 할 수 있 는 양 방향 연결 바이트 흐름 을 제공 합 니 다.외부 데이터 전송 메커니즘 을 지원 할 수 있 습 니 다.  아무리 큰 데이터 라 도 차단 되 지 않 습 니 다.  SOCK_DGRAM (데이터 신문): 데이터 신문 (고정 최대 길이 의 연결 없 음, 신뢰 할 수 없 는 메시지) 을 지원 합 니 다. 데이터 신문 이 최대 길 이 를 초과 하면 절 단 됩 니 다. socket 파일 설명 자 를 가 져 온 후 파일 에 연결 해 야 합 니 다.
 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd :   sock      
addr :  sockaddr_un  
addrlen :      

 
struct sockaddr_un {
    sa_family_t sun_family; /* AF_UNIX */
    char sun_path[UNIX_PATH_MAX];   /* pathname */
};

클 라 이언 트 의 연결 을 감청 하 는 int listen (int sockfd, int backlog), sockfd: 파일 설명자 backlog: 연결 대기 열의 길 이 는 클 라 이언 트 의 연결 int accept (int socket, struct sockaddr * restrict address, socklen t * restrict address len) 를 받 습 니 다. UDS 는 클 라 이언 트 주소 에 문제 가 없 기 때문에 여기 addr 와 addrlen 인 자 는 NULL 로 설정 할 수 있 습 니 다. 
Demo  
uds-server.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define MAX_CONNECT_NUM 2
#define BUFFER_SIZE 1024
const char *filename="uds-tmp";int main()
{
    int fd,new_fd,len,i;
    struct sockaddr_un un;
    fd = socket(AF_UNIX,SOCK_STREAM,0);
    if(fd < 0){
        printf("Request socket failed!
");         return -1;     }     un.sun_family = AF_UNIX;     unlink(filename);     strcpy(un.sun_path,filename);     if(bind(fd,(struct sockaddr *)&un,sizeof(un)) <0 ){         printf("bind failed!
");         return -1;     }     if(listen(fd,MAX_CONNECT_NUM) < 0){         printf("listen failed!
");         return -1;     }     while(1){         struct sockaddr_un client_addr;         char buffer[BUFFER_SIZE];         bzero(buffer,BUFFER_SIZE);         len = sizeof(client_addr);         //new_fd = accept(fd,(struct sockaddr *)&client_addr,&len);         new_fd = accept(fd,NULL,NULL);         if(new_fd < 0){             printf("accept failed
");             return -1;         }         int ret = recv(new_fd,buffer,BUFFER_SIZE,0);         if(ret < 0){             printf("recv failed
");         }         for(i=0; i<10; i++){             printf(" %d",buffer[i]);         }         close(new_fd);         break;     }     close(fd); }

 
uds-client.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFFER_SIZE 1024
const char *filename="uds-tmp";

int main()
{
    struct sockaddr_un un;
    int sock_fd;
    char buffer[BUFFER_SIZE] = {1,2,3};
    un.sun_family = AF_UNIX;
    strcpy(un.sun_path,filename);
    sock_fd = socket(AF_UNIX,SOCK_STREAM,0);
    if(sock_fd < 0){
        printf("Request socket failed
");         return -1;     }     if(connect(sock_fd,(struct sockaddr *)&un,sizeof(un)) < 0){         printf("connect socket failed
");         return -1;     }     send(sock_fd,buffer,BUFFER_SIZE,0);     close(sock_fd);     return 0; }

Linux 의 IPC - UNIX Domain Socket 프로 세 스 통신 의 6 UDS 프로 세 스 간 통신 프로필 (1) Unix 도 메 인 소켓 (Unix Domain Socket) 소개  저자: 프로그래머  출처: CSDN  원문:https://blog.csdn.net/z2066411585/article/details/78966434  저작권 성명: 본 고 는 블 로 거들 의 오리지널 글 입 니 다. 블 로 거들 링크 를 동봉 해 주 십시오!

좋은 웹페이지 즐겨찾기