Linux 에서 프로 세 스 간 통신 방식 - UNIX Domain Socket
4842 단어 Nginx
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 저작권 성명: 본 고 는 블 로 거들 의 오리지널 글 입 니 다. 블 로 거들 링크 를 동봉 해 주 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
linux2에 nginx 설치설치 가능한 nginx를 확인하고, 해당 nginx를 설치한다. localhost 혹은 해당 ip로 접속을 하면 nginx 화면을 볼 수 있다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.