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()必要があります。C でソケットを使用するためのチュートリアルは、こちらにあります。 socketpair()socket()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

ソケットは常にそのソケットに送信されたリクエストを処理するサーバーに接続されるため、ソケットを作成するためのコマンド ライン ツールはありません。

したがって、サーバーを作成し、ソケットを作成する必要があります。チュートリアルはこちら

関連情報