
我知道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
。是否有創建命名套接字的命令?
最後一個選擇是編寫一個 C 程序,它將呼叫 mknod 函數,但想知道是否已經有一個命令。
我嘗試過的:
我嘗試搜尋 mknod 和 mkfifo 的任何選項,但找不到。
注意:我不是討論乙太網路/網路上的伺服器-客戶端模型。指定的套接字檔案將由同一系統上的 2 個進程使用。
答案1
Unix/Linux 套接字檔案基本上是雙向 FIFO。由於套接字最初是作為管理網路通訊的一種方式創建的,因此可以使用send()
和recv()
系統呼叫來操作它們。然而,本著「一切皆文件」的 Unix 精神,您也可以使用write()
和read()
。您需要使用socketpair()
或socket()
建立命名套接字。在 C 語言中使用套接字的教學可以在這裡找到:
Beej 的 Unix IPC 指南:Unix 套接字。
socat
當您想要使用套接字而不編寫“真正的”程式時,命令列實用程式非常有用。它類似於netcat
不同網路和檔案介面之間的適配器,並且充當不同網路和檔案介面之間的適配器。
連結:
答案2
在python中快速建立一個socket:
~]# 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
答案3
沒有命令列工具來建立套接字,因為套接字始終連接到處理發送到該套接字的請求的伺服器。
因此,您必須編寫一個伺服器並讓它創建套接字。這是一個教程。