
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
소켓은 항상 해당 소켓으로 전송된 요청을 처리하는 서버에 연결되므로 소켓을 생성하는 명령줄 도구가 없습니다.
따라서 서버를 작성하고 소켓을 생성해야 합니다.여기 튜토리얼이 있습니다.