Linux 명명된 소켓 하우투

Linux 명명된 소켓 하우투

Linux에는 명명된 소켓과 명명된 파이프(fifo)가 있다는 것을 알고 있습니다.

에서는 ls -l다음과 같이 보입니다. (데모를 위해 파일 이름을 변경했습니다.)

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개 프로세스에서 사용됩니다.

답변1

Unix/Linux 소켓 파일은 기본적으로 양방향 FIFO입니다. 소켓은 원래 네트워크 통신을 관리하기 위한 방법으로 생성되었으므로 send()recv()시스템 호출을 사용하여 소켓을 조작할 수 있습니다. 그러나 "모든 것이 파일이다"라는 Unix 정신에 따라 write()및 를 사용할 수도 있습니다 read(). 명명된 소켓을 사용 socketpair()하거나 socket()생성 해야 합니다 . C에서 소켓을 사용하는 방법에 대한 튜토리얼은 여기에서 찾을 수 있습니다: Beej의 Unix IPC 가이드: Unix 소켓.

명령 socat줄 유틸리티는 "실제" 프로그램을 작성하지 않고 소켓을 가지고 놀고 싶을 때 유용합니다. 이는 netcat서로 다른 네트워킹 및 파일 인터페이스 간의 어댑터와 유사하며 역할을 합니다.

연결:

답변2

Python에서 빠르게 소켓을 만듭니다.

~]# 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를 설치하고 컴파일한 후 다음을 수행하십시오.

~]# 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

답변3

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

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

관련 정보