/ dev / tcp लिनक्स में मौजूद नहीं है


9

मैं UNIX से Linux में C / pro * c कोड पोर्ट कर रहा हूं। कोड है:

#define __NFDBIT       (8 * sizeof(unsigned long))
#define __FD_SETSIZ    1024
#define __FDSET_LONG   (__FD_SETSIZ/__NFDBIT)
typedef struct {
    unsigned long fds_bits [__FDSET_LONG];
} __ernel_fd_set;

typedef __ernel_fd_set           fd_set_1;
int main()
{
    fd_set_1 listen_set;
    int listen_sd;
    int socket_id;
    FD_ZERO(&listen_set);
    socket_id = t_open("/dev/tcp", O_RDWR|O_NONBLOCK, (struct t_info *) 0);
    if ( socket_id <0 )
    {
        exit(FAILURE);
    }
    return 0;
}

UNIX में socket_id का मान > 0लिनक्स में है -1। कारण UNIX में है, एक है /dev/tcp। यह लिनक्स पर मौजूद नहीं है। इसके अलावा UNIX में यह tcpफ़ाइल वर्ण विशेष फ़ाइल है जो सामान्य फ़ाइल से अलग है।

क्या लिनक्स में समान चरित्र विशेष फ़ाइल बनाने का कोई तरीका है जैसा कि UNIX में है या इसे आगे कैसे बढ़ाया जाए?


5
क्या कोई कारण है कि आप बर्कले सॉकेट्स / पॉसिक्स सॉकेट्स का उपयोग नहीं करते हैं ?
जोफेल

हाँ जोफेल। उस स्थिति में मुझे बड़ी मात्रा में मौजूदा कोड को संशोधित करना होगा जो संभव नहीं है। मैं लिनक्स में / dev / tcp के प्रतिस्थापन की तलाश कर रहा हूं या यह लिनक्स में कैसे बनाया जाना चाहिए ताकि यह यूनिक्स की तरह काम कर सके। Unix में / dev / tcp के बारे में जानकारी निम्नलिखित है।
मिसिंगेमिसोलोन

1
आप अपने सॉफ़्टवेयर को कैसे संकलित करते हैं? लिनक्स पर AFAIK, XTI / TLI केवल कुछ अतिरिक्त तरह पुस्तकालयों के द्वारा समर्थित है लिनक्स स्ट्रीम OpenSS7 से फास्ट emulators की तरह या IBCs । लिनक्स पर बस / dev / tcp बनाने का कोई तरीका नहीं है। आपको बैश से इस्तेमाल किया हुआ देव / देव / tcp मिल सकता है, लेकिन इस मामले में यह सिर्फ एक राहत है जो bash को tcp सॉकेट खोलने के लिए कहता है। डिवाइस वास्तव में मौजूद नहीं है।
जोफेल

cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet निष्पादित बाइनरी फ़ाइल टेस्ट। कमांड mknod tcp c <x> y: का उपयोग करके / dev के तहत कैरेक्टर फ़ाइल tcp बनाने का एक तरीका है। यूनिक्स में tcp के लिए डिवाइस प्रविष्टियां 42,2 हैं। वह फ़ाइल कमांड (फ़ाइल / डेव / टीसीपी) "चरित्र विशेष (42/2)" दिखाता है जहां x = 42 और y = 2 है। लेकिन उन्हीं प्रविष्टियों के साथ मैंने लिनक्स में mknod tcp c 42 2.again socket_id -1 बनाया है। यहाँ समस्या लिनक्स उपयोग की जाने वाली डिवाइस प्रविष्टियों की है।
missingsemicolon

1
@smilebhuff नोड बनाने के लिए पर्याप्त नहीं है, कर्नेल में कोई व्यक्ति इसके लिए जिम्मेदार होना चाहिए - जो कि लिनक्स के मामले में नहीं है।
ग्लोगल

जवाबों:


18

t_open()और इसके संबद्ध /dev/tcpऔर ऐसे TLI / XTI इंटरफ़ेस का हिस्सा हैं , जो BSD सॉकेट्स के लिए TCP / IP APIs की लड़ाई हार गए।

लिनक्स पर, एक /dev/tcpप्रकार है। यह एक वास्तविक फ़ाइल या कर्नेल डिवाइस नहीं है। यह कुछ विशेष रूप से बैश द्वारा प्रदान किया गया है , और यह केवल पुनर्निर्देशन के लिए मौजूद है। इसका अर्थ है कि यदि कोई इन-कर्नेल /dev/tcpसुविधा बनाता है , तो भी यह शेल द्वारा उस समय के 99% [*] इंटरैक्टिव उपयोग में लाया जाएगा।

सबसे अच्छा समाधान वास्तव में बीएसडी सॉकेट्स पर स्विच करना है। माफ़ करना।

आप काम करने के लिए स्ट्रैक्सनेट XTI इम्यूलेशन लेयर प्राप्त करने में सक्षम हो सकते हैं , लेकिन आप अपना समय एक्सटीआई से हटने में लगाते हैं। यह एक मृत एपीआई है, न केवल लिनक्स पर, बल्कि ओएस एक्स सहित बीएसडी पर भी।

(वैसे, स्ट्रैसनेट लाइब्रेरी बीएसडी पर भी नहीं बनेगी, क्योंकि यह लिनक्स कर्नेल के एक घटक LiS पर निर्भर करती है । यह configureबीएसडी या OS X सिस्टम पर भी नहीं चलेगी , जाहिरा तौर पर क्योंकि यह भी निर्भर करता है GNU sed।)

[*] मैं इस जंगली अनुमान को इस तथ्य पर आधारित करता हूं कि मेरे द्वारा उपयोग किए गए सभी लिनक्स डिस्ट्रोस में गैर-रूट उपयोगकर्ताओं के लिए बैश डिफ़ॉल्ट शेल है। इसलिए आपको बैश के अलावा कुछ और प्राप्त करने के लिए, एक नियम के रूप में, लिनक्स पर अपने रास्ते से बाहर जाना होगा।


आपके इनपुट के लिए वॉरेन धन्यवाद। माफ करना, मैं इन सॉकेट प्रोग्रामिंग और एपीआई अवधारणाओं के लिए बहुत नया हूं। कृपया मेरे सवालों के साथ नंगे। "स्ट्रैक्सेनेट एक्सटीआई एमुलेशन लेटियर" से आपका क्या मतलब है हमने हाल ही में स्ट्रैसनेट (स्ट्रैक्स-0.9.2.10.tar) में से एक को ओपन -7 लाइब्रेरी / हेडरफाइल्स में से कुछ के लिए स्थापित किया है। मैं इसके साथ और क्या कर सकता हूं?
मिसिंगेमिसोलोन

मैंने इसे खुद कभी इस्तेमाल नहीं किया है, लेकिन टारबॉल की त्वरित परीक्षा से, ऐसा लगता है कि एक बार स्थापित होने के बाद, यह एक एक्सटीआई अनुकरण परत प्रदान करता है। आपको बस उस पर -Iऔर -Lझंडे के साथ अपने संकलक को इंगित करने में सक्षम होना चाहिए और यह काम करने की उम्मीद करना चाहिए। लेकिन अगर ऐसा नहीं होता है, तो मैं उस पर बहुत समय नहीं फेंकूंगा।
वारेन यंग

मैं -I और -L के बारे में जानता हूं जो क्रमशः हेडर / लाइब्रेरी शामिल करना है। लेकिन वास्तव में मुझे यहाँ क्या करना है -I / -L के साथ? खेद है अगर मेरा प्रश्न गलत है।
मिसिंगेमिसोलोन

1
यह निर्भर करता है कि पैकेज ने फाइलों को कहां स्थापित किया है। लाइब्रेरी फ़ाइल ढूंढें libstrxnet.so.*: वह निर्देशिका जो आप पास करते हैं -L। खोजें xti.h: उस निर्देशिका को पास करें -I। आपको -lstrxnetन्यूनतम भी आवश्यकता होगी । निचला रेखा: स्ट्रैक्सनेट डॉक्स देखें।
वॉरेन यंग

वॉरेन, जो मैंने संकलन के दौरान किया है। कृपया पिछले चरण में दिए गए चरणों को देखें। इस लाइब्रेरी में t_open () फ़ंक्शन है। लेकिन समस्या इस फ़ंक्शन के साथ नहीं है। समस्या के साथ / dev / tcp है जो t_open खोलने की कोशिश कर रहा है।
मिसिंगेमिसोलन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.