Linux命名套接字howto


38

我知道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个进程使用。


2
请注意:我有2个进程-qemu和virsh,它们可以使用命名套接字相互通信(根据我对文档的理解),但是我不知道如何创建命名套接字。虽然还有其他选项可以将virsh与qemu一起使用,但我一直在寻找一个选项,其中可以将virsh附加到现有的qemu进程上,并且需要在启动qemu进程时使用命名套接字。命名为fifo无效。另外,我认为,如果以后需要它,知道如何创建命名套接字将很有趣。
anishsane

Answers:


24

Unix / Linux套接字文件基本上是双向FIFO。由于套接字最初是作为管理网络通信的一种方式创建的,因此可以使用send()recv()系统调用来操作它们。但是,本着Unix的精神,“一切都是文件”,您也可以使用write()read()。您需要使用socketpair()socket()创建命名套接字。在C中使用套接字的教程可以在这里找到: Beej的Unix IPC指南:Unix套接字

socat当您想玩套接字而不编写“真实”程序时,命令行实用程序很有用。它类似于netcat并用作不同网络和文件接口之间的适配器。

链接:


1
socketpair()或socket()创建一个未命名的套接字,该套接字仅在C程序中有用。
anishsane 2012年

检查是否有可能使用创建命名套接字,这将很有趣socat。可能创建一个未命名的套接字,将其绑定到localhost:some_port,然后将socat与该端口一起使用?
anishsane 2012年

3
可以使用socatUNIX-LISTEN命令创建命名套接字,请参阅man socat或参阅此HTML手册
JoakimNohlgård2012年

1
我尝试了这个快速而肮脏的命令,它创建了一个套接字文件f1socat UNIX-LISTEN:f1 LISTEN:f2
Totor

1
它埋在socat网站的详细信息中,但是如果有帮助,有一种语法可以将两个单向命名管道(fifo)视为一个双向单元,可以桥接到其他双向实体,例如Unix或TCP套接字。您将命名管道与!!(socat 1.x)或%(socat 2.x)结合在一起,左侧的文字命名管道,右侧的读数命名管道。例如socat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
Ivan X

17

在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,对其进行编译,然后使用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

由于套接字始终连接到处理发送到该套接字的请求的服务器,因此没有用于创建套接字的命令线工具。

因此,您将必须编写服务器,然后由它创建套接字。这是一个教程


那仍然是一个未命名的套接字。我想创建一个套接字,该套接字将被其他2个进程用作双向fifo。
anishsane 2012年

检查我的答案中的链接。它显示了如何配置bind()以连接至"/home/beej/mysocket"
Aaron Digulla 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.