리눅스 명명 된 소켓 하우투


38

리눅스에는 소켓과 파이프 (fifo)가 있다는 것을 알고 있습니다.

에서 ls -l, 그들은 다음과 같이 보일 것이다 : (I 데모를 들어, 파일 이름을 변경했습니다.)

prw-r--r-- 1 root root 0 Nov  8 16:31 /tmp/fifo
srwxrwxrwx 1 root root 0 Nov  8 15:54 /tmp/socket

이제를 사용하여 명명 된 파이프를 만들 수 있습니다 mkfifo. 명명 된 소켓을 만드는 명령이 있습니까?

마지막 옵션은 mknod 함수를 호출하는 C 프로그램을 작성하는 것이지만 이미 해당 명령이 있는지 알고 싶었습니다.

내가 시도한 것 :
mknod & mkfifo에 대한 옵션을 찾으려고했지만 찾을 수 없었습니다.

참고 : 이더넷 / 네트워크를 통한 서버 클라이언트 모델에 대해서는 논의하고 있지 않습니다. 명명 된 소켓 파일은 동일한 시스템에서 2 개의 프로세스에 의해 사용됩니다.


2
참고 사항 : 나는 두 가지 프로세스-qemu & virsh를 가지고 있습니다 .qemu & virsh는 명명 된 소켓을 사용하여 서로 대화 할 수 있습니다 (문서를 기반으로 이해 한대로)하지만 명명 된 소켓을 만드는 방법을 모르겠습니다. qemu와 함께 virsh를 사용하는 다른 옵션이 있지만, qemu 프로세스 를 시작하는 동안 기존 qemu 프로세스에 virsh를 첨부 할 수 있고 명명 된 소켓 이 필요한 옵션을 찾고있었습니다 . 명명 된 fifo가 작동하지 않습니다. 또한 나중에 필요할 경우를 대비하여 명명 된 소켓을 만드는 방법을 아는 것이 흥미로울 것입니다.
anishsane

답변:


24

유닉스 / 리눅스 소켓 파일은 기본적으로 양방향 FIFO입니다. 소켓은 원래 네트워크 통신을 관리하기위한 방법으로 작성되었으므로 send()recv()시스템 호출을 사용하여 소켓을 조작 할 수 있습니다 . 그러나 "모든 것이 파일입니다"라는 유닉스 정신에서 write()및 을 사용할 수도 있습니다 read(). 명명 된 소켓 을 사용 socketpair()하거나 socket()만들어야합니다. C에서 소켓을 사용하는 방법은 Beej 's Guide to Unix IPC : Unix Sockets에 있습니다.

socat당신이 "진짜"프로그램을 작성하지 않고 소켓 놀러 할 때 명령 행 유틸리티 유용합니다. netcat다른 네트워킹과 파일 인터페이스 간의 어댑터와 유사 하며 어댑터 역할을합니다.

모래밭:


1
socketpair () 또는 socket ()은 이름이 지정되지 않은 소켓을 작성하는데, 이는 C 프로그램 내에서만 유용합니다.
anishsane

를 사용하여 명명 된 소켓을 만들 수 있는지 확인하는 것이 흥미로울 것 socat입니다. 아마도 이름이없는 소켓을 만들고 localhost : some_port에 바인딩 한 다음 해당 포트와 함께 socat을 사용합니까?
anishsane

3
사용하여 명명 소켓을 만들 수 있습니다 socat, 유닉스 LISTEN 명령을 참조 man socat하거나 수동이 HTML
조아킴 Nohlgård

1
나는이 빠른 & 더러운 명령을 시도하고 소켓 파일을 만든 f1: socat UNIX-LISTEN:f1 LISTEN:f2.
Totor

1
그것은 socat 웹 사이트의 세부 사항에 묻혀 있지만 도움이되는 경우 두 개의 단방향 명명 된 파이프 (fifo)를 단일 양방향 단위로 처리하여 Unix 또는 TCP 소켓과 같은 다른 양방향 엔티티에 브리지 할 수있는 구문이 있습니다. 명명 된 파이프를 !!(socat 1.x) 또는 %(socat 2.x)와 결합하고, 이름이 pipe 인 파이프는 왼쪽에 있고 이름이 pipe 인 파이프는 오른쪽에 있습니다. 예 :socat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
Ivan X

17

파이썬에서 신속하게 소켓을 만듭니다.

~]# python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/tmp/somesocket')"
~]# ll /tmp/somesocket 
srwxr-xr-x. 1 root root 0 Mar  3 19:30 /tmp/somesocket

또는 작은 C 프로그램을 사용하여 다음을 저장하십시오 create-a-socket.c.

#include <fcntl.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    // The following line expects the socket path to be first argument
    char * mysocketpath = argv[1];
    // Alternatively, you could comment that and set it statically:
    //char * mysocketpath = "/tmp/mysock";
    struct sockaddr_un namesock;
    int fd;
    namesock.sun_family = AF_UNIX;
    strncpy(namesock.sun_path, (char *)mysocketpath, sizeof(namesock.sun_path));
    fd = socket(AF_UNIX, SOCK_DGRAM, 0);
    bind(fd, (struct sockaddr *) &namesock, sizeof(struct sockaddr_un));
    close(fd);
    return 0;
}

그런 다음 gcc를 설치하고 컴파일 한 다음 ta-da를 실행하십시오.

~]# gcc -o create-a-socket create-a-socket.c
~]# ./create-a-socket mysock
~]# ll mysock
srwxr-xr-x. 1 root root 0 Mar  3 17:45 mysock

1

소켓은 항상 해당 소켓으로 전송 된 요청을 처리하는 서버에 연결되므로 소켓을 작성하기위한 명령 행 도구가 없습니다.

따라서 서버를 작성하고 소켓을 작성해야합니다. 여기 튜토리얼이 있습니다.


그것은 여전히 ​​이름이없는 소켓 일 것입니다. 양방향 fifo로 다른 두 프로세스에서 사용되는 소켓을 만들고 싶습니다.
anishsane

내 답변의 링크를 확인하십시오. bind()연결 을 설정하는 방법을 보여줍니다"/home/beej/mysocket"
Aaron Digulla
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.