Linux bernama soket howto

38

Saya tahu bahwa ada soket bernama & bernama pipa (fifo) di Linux.

Dalam ls -l, mereka akan terlihat seperti di bawah ini: (Saya telah mengubah nama file, untuk demonstrasi.)

prw-r--r-- 1 root root 0 Nov  8 16:31 /tmp/fifo
srwxrwxrwx 1 root root 0 Nov  8 15:54 /tmp/socket

Sekarang, pipa bernama dapat dibuat menggunakan mkfifo. Apakah ada perintah untuk membuat soket bernama?

Opsi terakhir adalah menulis program C, yang akan memanggil fungsi mknod, tetapi ingin tahu, apakah sudah ada perintah untuk itu.

Apa yang saya coba:
Saya mencoba mencari opsi apa saja ke mknod & mkfifo, tetapi tidak dapat menemukannya.

CATATAN: Saya tidak membahas tentang model server-klien melalui Ethernet / jaringan. File soket bernama akan digunakan oleh 2 proses pada sistem yang sama.

anishsane
sumber
2
Hanya sebuah catatan: Saya memiliki 2 proses - qemu & virsh, yang dapat berbicara satu sama lain menggunakan soket bernama (sesuai pemahaman saya berdasarkan dokumentasi) Tapi saya tidak tahu cara membuat soket bernama. Sementara ADA opsi lain untuk menggunakan virsh dengan qemu, saya sedang mencari opsi, di mana saya dapat melampirkan virsh ke proses qemu yang ada & membutuhkan soket bernama , saat memulai proses qemu. Namai fifo tidak berfungsi. Plus, saya pikir, akan menarik untuk mengetahui cara membuat soket bernama, kalau-kalau diperlukan nanti.
anishsane

Jawaban:

24

File soket Unix / Linux pada dasarnya adalah FIFO dua arah. Karena soket pada awalnya dibuat sebagai cara untuk mengelola komunikasi jaringan, dimungkinkan untuk memanipulasinya menggunakan send()dan recv()panggilan sistem. Namun, dalam semangat Unix "semuanya adalah file", Anda juga dapat menggunakan write()dan read(). Anda perlu menggunakan socketpair()atau socket()membuat soket bernama. Tutorial untuk menggunakan soket di C dapat ditemukan di sini: Panduan Beej untuk Unix IPC: Unix Sockets .

The socatutilitas baris perintah ini berguna bila Anda ingin bermain-main dengan soket tanpa menulis "nyata" program. Mirip netcatdan bertindak sebagai adaptor antara berbagai jaringan dan antarmuka file.

Tautan:

Joakim Nohlgård
sumber
1
socketpair () atau socket () membuat soket tidak bernama, yang hanya akan berguna dari dalam program C.
anishsane
Akan menarik untuk memeriksa, apakah mungkin untuk membuat soket bernama menggunakan socat. Mungkin, buat soket yang tidak bernama, ikat ke localhost: some_port & kemudian gunakan socat dengan port itu?
anishsane
3
Dimungkinkan untuk membuat soket bernama menggunakan socatdengan perintah UNIX-LISTEN, lihat man socatatau manual HTML ini
Joakim Nohlgård
1
Saya mencoba cepat & kotor perintah ini dan itu menciptakan sebuah file socket f1: socat UNIX-LISTEN:f1 LISTEN:f2.
Totor
1
Ini terkubur dalam rincian situs web socat, tetapi jika itu membantu, ada sintaks untuk memperlakukan dua pipa bernama searah (fifo) sebagai unit bidirectional tunggal yang dapat dijembatani dengan entitas dua arah lainnya seperti soket Unix atau TCP. Anda bergabung dengan pipa bernama dengan !!(socat 1.x) atau %(socat 2.x), dengan tulisan pipa bernama di sebelah kiri dan bacaan bernama pipa di sebelah kanan. misalnyasocat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
Ivan X
17

Buat socket dengan cepat dalam 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

Atau dengan program C kecil , misalnya, simpan yang berikut ini untuk 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;
}

Kemudian instal gcc, kompilasi, dan 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
rsaw
sumber
1

Tidak ada alat garis perintah untuk membuat soket karena soket selalu terhubung ke server yang menangani permintaan yang dikirim ke soket itu.

Jadi, Anda harus menulis server dan membiarkannya membuat soket. Ini tutorialnya .

Aaron Digulla
sumber
Itu masih akan menjadi soket tanpa nama. Saya ingin membuat soket, yang akan digunakan oleh 2 proses lainnya, sebagai fifo dua arah.
anishsane
Periksa tautan dalam jawaban saya. Ini menunjukkan cara mengkonfigurasi bind()untuk terhubung ke"/home/beej/mysocket"
Aaron Digulla