GNU/Linux >> Linux の 問題 >  >> Linux

Linux 名前付きソケットのハウツー

Unix/Linux ソケット ファイルは、基本的に双方向 FIFO です。ソケットはもともとネットワーク通信を管理する方法として作成されたため、send() を使用してソケットを操作することができます。 そして recv() システムコール。ただし、「すべてがファイルである」という Unix の精神では、write() も使用できます。 と read() . socketpair() を使用する必要があります または socket() 名前付きソケットを作成します。 C でソケットを使用するためのチュートリアルは、Beej の Unix IPC ガイド:Unix Sockets にあります。

socat コマンド ライン ユーティリティは、「実際の」プログラムを作成せずにソケットをいじりたいときに便利です。 netcat に似ています 異なるネットワークとファイル インターフェイス間のアダプターとして機能します。

リンク:

  • socat プロジェクト ホーム
  • socat の紹介
  • Unix ソケットと socat に関する興味深い記事

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

Linux
  1. CentOS7Linuxにifconfigをインストールする方法

  2. ハウツー:Linux でのディレクトリを使用した C プログラミング

  3. 接続が開いているか閉じているかを確認しますか? (Linux の C)

  1. プロセスが所有するソケットを判別するための Linux API

  2. どの Linux IPC 手法を使用しますか?

  3. Linux Bash での名前付きパイプの使用例

  1. Linux、ソケット、ノンブロッキング接続

  2. Linux での名前付きの条件付き DNS 転送

  3. Unix ソケットと TCP/IP ホスト:ポート