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。是否有創建命名套接字的命令?

最後一個選擇是編寫一個 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

沒有命令列工具來建立套接字,因為套接字始終連接到處理發送到該套接字的請求的伺服器。

因此,您必須編寫一個伺服器並讓它創建套接字。這是一個教程

相關內容