लिनक्स का नाम सॉकेट्स हाउटो है


38

मुझे पता है कि लिनक्स में सॉकेट्स और नाम वाले पाइप (पेंडो) हैं।

में 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 & mkfifo के लिए किसी भी विकल्प की तलाश करने की कोशिश की, लेकिन एक नहीं मिला।

नोट: मैं ईथरनेट / नेटवर्क पर सर्वर-क्लाइंट मॉडल के बारे में चर्चा नहीं कर रहा हूं। नामित सॉकेट फ़ाइल का उपयोग एक ही सिस्टम पर 2 प्रक्रियाओं द्वारा किया जाएगा।


2
बस एक नोट: मेरे पास 2 प्रक्रियाएं हैं - qemu & virsh, जो एक दूसरे से सॉकेट का उपयोग करके बात कर सकते हैं (जैसा कि प्रलेखन के आधार पर मेरी समझ के अनुसार) लेकिन मुझे नहीं पता कि नामांकित सॉकेट कैसे बनाया जाए। जबकि qemu के साथ virsh का उपयोग करने के लिए अन्य विकल्प हैं, मैं एक विकल्प की तलाश कर रहा था, जिसमें मैं मौजूदा qemu प्रक्रिया में virsh को संलग्न कर सकूं और qemu प्रक्रिया को शुरू करते समय इसे एक नामित सॉकेट की आवश्यकता है । नामांकित फिफो काम नहीं करते। इसके अलावा, मुझे लगता है, यह जानना दिलचस्प होगा कि नाम सॉकेट कैसे बनाया जाए, अगर बाद में इसकी आवश्यकता होती है।
ऐशसेन

जवाबों:


24

एक यूनिक्स / लिनक्स सॉकेट फ़ाइल मूल रूप से एक दो तरफा फीफो है। चूंकि सॉकेट्स मूल रूप से नेटवर्क संचार का प्रबंधन करने के तरीके के रूप में बनाए गए थे, इसलिए उन्हें send()और recv()सिस्टम कॉल का उपयोग करके हेरफेर करना संभव है । हालांकि, "सब कुछ एक फ़ाइल है" की यूनिक्स भावना में, आप भी उपयोग कर सकते हैं write()और read()। आपको नामित सॉकेट्स का उपयोग करने socketpair()या socket()बनाने की आवश्यकता है । सी में सॉकेट्स का उपयोग करने के लिए एक ट्यूटोरियल यहां पाया जा सकता है: बीजेज़ गाइड टू यूनिक्स आईपीसी: यूनिक्स सॉकेट्स

socatजब आप एक 'असली' प्रोग्राम लिखने के बिना सॉकेट के साथ चारों ओर खेलना चाहते हैं कमांड लाइन उपयोगिता उपयोगी है। यह netcatविभिन्न नेटवर्किंग और फ़ाइल इंटरफेस के बीच एडेप्टर के समान है और कार्य करता है।

लिंक:


1
सॉकेटपेयर () या सॉकेट () एक गैर-नामित सॉकेट बनाता है, जो केवल सी प्रोग्राम के भीतर से उपयोगी होगा।
ऐश्वरन

यह जांचना दिलचस्प होगा कि क्या नामांकित सॉकेट का उपयोग करना संभव है socat। संभवतः, एक गैर-नामित सॉकेट बनाएं, इसे लोकलहोस्ट पर बांधें: some_port और फिर उस पोर्ट के साथ सोसाइट का उपयोग करें?
ऐश्वरन

3
यह का उपयोग कर नामित सॉकेट बनाने के लिए संभव है socat, यूनिक्स सुनें कमांड के साथ देखते हैं man socatया इस HTML मैनुअल
Joakim Nohlgård

1
मैं इस त्वरित और गंदा आदेश की कोशिश की है और यह एक सॉकेट फ़ाइल बनाई f1: socat UNIX-LISTEN:f1 LISTEN:f2
Totor

1
इसे सोसाइट वेबसाइट के विवरण में दफनाया गया है, लेकिन अगर यह मददगार है, तो दो एकल-अप्रत्यक्ष नाम वाले पाइप (फीफो) के लिए एक एकल द्विदिश इकाई के रूप में एक सिंटैक्स है, जिसे यूनिक्स या टीसीपी सॉकेट्स के लिए अन्य बोली-पूर्व संस्थाओं के लिए ब्रिज किया जा सकता है। आप नामित पाइप के साथ !!(सोसाइट 1.x) या %(सोसाइट 2.x) के साथ जुड़ते हैं, बाईं ओर पाइप का नाम और दाईं ओर रीडिंग पाइप नाम के साथ। जैसेsocat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
इवान एक्स

17

अजगर में जल्दी से एक सॉकेट बनाएं:

~]# 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

या एक छोटे सी कार्यक्रम के साथ , उदाहरण के लिए, निम्न को सहेजें 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 -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 अन्य प्रक्रियाओं द्वारा किया जाएगा, द्विदिश रूप में।
अनीसने 12

मेरे उत्तर में लिंक की जाँच करें। यह दिखाता है कि bind()कनेक्ट करने के लिए कॉन्फ़िगर कैसे करें"/home/beej/mysocket"
हारून डिगुल्ला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.