Z / OS पर C ++ में C सॉकेट एपीआई का उपयोग कैसे करें


158

मैं मुद्दों में ठीक से काम करने के लिए सी सॉकेट एपीआई हो रही हो रही है C++पर z/OS

यद्यपि मैं इसमें शामिल sys/socket.hहूं, फिर भी मुझे यह बताते हुए संकलन समय त्रुटियां मिलती हैं कि AF_INETयह परिभाषित नहीं है

क्या मुझे कुछ स्पष्ट याद आ रहा है, या यह इस तथ्य से संबंधित है कि होने के नाते z/OSमेरी समस्याओं को और अधिक जटिल बना देता है?


अपडेट : आगे की जांच के बाद, मुझे पता चला कि एक है #ifdefजो मैं मार रहा हूं। जाहिर है z/OSजब तक कि मैं परिभाषित जो सॉकेट मैं के साथ उपयोग कर रहा हूँ की "टाइप" खुश नहीं है:

#define _OE_SOCKETS

अब, मुझे व्यक्तिगत रूप से पता नहीं है कि यह _OE_SOCKETSवास्तव में किसके लिए है, इसलिए यदि कोई भी z/OSसॉकेट प्रोग्रामर बाहर है (आप सभी 3), तो शायद आप मुझे इस बात का एक विवरण दे सकते हैं कि यह सब कैसे काम करता है?


टेस्ट ऐप

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

संकलन / लिंक आउटपुट:

cxx -Wc,xplink -Wl,xplink -o inet_test inet.C

"./inet.C", line 5.16: CCN5274 (S) The name lookup for "AF_INET" did not find a declaration.
CCN0797(I) Compilation failed for file ./inet.C. Object file not created.

Sys / sockets.h के एक चेक में मेरी ज़रूरत की परिभाषा शामिल है, और जहाँ तक मैं बता सकता हूँ, इसे किसी भी #ifdefबयान से अवरुद्ध नहीं किया जा रहा है ।

लेकिन मैंने देखा है कि इसमें निम्नलिखित शामिल हैं:

#ifdef __cplusplus
  extern "C" {
#endif

जो मूल रूप से पूरी फाइल को इनकैप्सुलेट करता है? यकीन नहीं होता अगर यह मायने रखता है।

जवाबों:


86

आईबीएम मैनुअल की एक प्रति संभाल रखें:

आईबीएम प्रकाशन आम तौर पर बहुत अच्छे होते हैं, लेकिन आपको उनके प्रारूप का उपयोग करने की आवश्यकता होती है, साथ ही यह भी जानना चाहिए कि उत्तर की तलाश कहाँ करें। आप बहुत बार पाएंगे कि एक सुविधा जिसे आप उपयोग करना चाहते हैं वह "फीचर टेस्ट मैक्रो" द्वारा संरक्षित है।

आपको अपने सिस्टम पर XL C / C ++ रन-टाइम लाइब्रेरी संदर्भ: मैन पेज इंस्टॉल करने के लिए अपने अनुकूल सिस्टम प्रोग्रामर से पूछना चाहिए । फिर आप सॉकेट कनेक्ट () एपीआई के लिए मैन पेज को खींचने के लिए "मैन कनेक्ट" जैसी चीजें कर सकते हैं। जब मैं ऐसा करता हूं, तो मैं यही देखता हूं:

प्रारूप

X / ओपन

#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>

int connect(int socket, const struct sockaddr *address, socklen_t address_len);

बर्कले सॉकेट्स

#define _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>

int connect(int socket, struct sockaddr *address, int address_len);

38

मुझे ग्नू / लिनक्स में सी ++ में बीएसडी सॉकेट्स एपीआई का उपयोग करने में कोई परेशानी नहीं हुई है। यहाँ नमूना कार्यक्रम मैंने उपयोग किया है:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

तो मेरा इस पर ध्यान रखना यह है कि z / OS शायद यहाँ जटिल कारक है, हालाँकि, क्योंकि मैंने पहले कभी z / OS का उपयोग नहीं किया है, इसमें बहुत कम क्रमादेशित है, मैं इसे निश्चित रूप से नहीं कह सकता। :-P


32

Z / OS XL C / C ++ प्रोग्रामिंग गाइड का उपयोग करके z / OS UNIX सिस्टम सेवा सॉकेट अनुभाग देखें । सुनिश्चित करें कि आप आवश्यक हेडर फ़ाइलों को शामिल कर रहे हैं और उपयुक्त #defines का उपयोग कर रहे हैं।

डॉक्टर के लिए लिंक पिछले कुछ वर्षों में बदल गया है, लेकिन आपको ibm.com पर समर्थन और डाउनलोड अनुभाग की वर्तमान स्थिति का पता लगाने और शीर्षक द्वारा प्रलेखन की खोज करके इसे आसानी से प्राप्त करने में सक्षम होना चाहिए ।


26

_OE_SOCKETS सॉकेट-संबंधित प्रतीकों की परिभाषा को सक्षम / अक्षम करने के लिए बस प्रतीत होता है। कुछ पुस्तकालयों में मैक्रोज़ का एक समूह होना असामान्य नहीं है, यह सुनिश्चित करने के लिए कि आप ज़रूरत के अनुसार भागों को संकलित / लिंक नहीं कर रहे हैं। मैक्रो अन्य सॉकेट कार्यान्वयन में मानक नहीं है, यह z / OS के लिए कुछ विशिष्ट प्रतीत होता है।

इस पृष्ठ पर एक नज़र डालें:
संकलन और लिंकिंग एज / वीएम सी सॉकेट्स प्रोग्राम


2
z / OS में z / VM के साथ सामान्य रूप से बहुत कुछ है जैसा कि Windows लिनक्स के साथ करता है, इसलिए मैं थोड़ा हैरान हूं कि आपने उस लिंक को पोस्ट क्यों किया।
paxdiablo

ध्यान दें कि _OE_SOCKETS मैक्रो दोनों में दिखाई देता है, और एक ही उद्देश्य है। जो आश्चर्यजनक नहीं है, क्योंकि शायद आईबीएम ने दोनों उत्पादों में सॉकेट समर्थन के लिए समान कोड आधार का उपयोग किया था। मेरा यह कहने का इरादा नहीं था कि z / VM दस्तावेज़ीकरण z / OS पर लागू होता है, यह मेरे द्वारा पाया गया सबसे समान मामला है।
फैबियो सेकोनेलो

1
मुझे लगता है कि यह सिर्फ एक संयोग है। z / VM z / OS भाषा पर्यावरण उत्पाद का उपयोग नहीं करता है, जो सॉकेट कॉल करने के लिए उपयोग की जाने वाली प्रासंगिक हेडर फाइलें प्रदान करता है।
एंथोनी जियोर्जियो

25

इसलिए कोशिश करें

#define _OE_SOCKETS

इससे पहले कि आप sys / socket.h शामिल करें


19

आप cpp- सॉकेट्स पर एक नज़र रखना चाहते हैं , सॉकेट्स सिस्टम कॉल के लिए C ++ रैपर लगा सकते हैं। यह कई ऑपरेटिंग सिस्टम (Win32, POSIX, Linux, * BSD) के साथ काम करता है। मुझे नहीं लगता कि यह z / OS के साथ काम करेगा लेकिन आप इसमें शामिल फ़ाइलों का उपयोग कर सकते हैं और आपके पास परीक्षण किए गए कोड के कई उदाहरण होंगे जो अन्य OS पर अच्छी तरह से काम करते हैं।


18

@ जैक्स: extern "C"बात बहुत मायने रखती है। यदि हेडर फ़ाइल में एक नहीं है, तो (जब तक कि यह C ++ - केवल हेडर फ़ाइल नहीं है), तो आपको इसके #includeसाथ अपना एनक्लोज़ करना होगा:

extern "C" {
#include <sys/socket.h>
// include other similarly non-compliant header files
}

मूल रूप से, कभी भी जहां एक C ++ प्रोग्राम C- आधारित सुविधाओं से लिंक करना चाहता है, extern "C"वह महत्वपूर्ण है। व्यावहारिक रूप से, इसका मतलब है कि बाहरी संदर्भों में उपयोग किए जाने वाले नामों को मंगली नहीं किया जाएगा, जैसे सामान्य सी ++ नाम। संदर्भ।


14

अस्वीकरण: मैं एक सी ++ प्रोग्रामर नहीं हूं, हालांकि मैं सी को वास्तव में अच्छी तरह से जानता हूं। मेरे पास कुछ C कोड के ये कॉल अडॉप्ट किए गए हैं।

इसके अलावा मार्कडाउन ने इन अजूबों को मेरे अंडरस्कोर के रूप में रखा।

आपको बस सी सॉकेट्स के चारों ओर एक अमूर्त वर्ग लिखने में सक्षम होना चाहिए:

class my_sock {
    private int sock;
    private int socket_type;
    private socklen_t sock_len;
    private struct sockaddr_in server_addr;
    public char *server_ip;
    public unsigned short server_port;
};

फिर सॉकेट के नीचे पैकेट खोलने, बंद करने और भेजने के तरीके हैं।

उदाहरण के लिए, खुली कॉल कुछ इस तरह दिख सकती है:

int my_socket_connect()
{
    int return_code = 0;

    if ( this->socket_type != CLIENT_SOCK ) {
        cout << "This is a not a client socket!\n";
        return -1;
    }

    return_code = connect( this->local_sock, (struct sockaddr *) &this->server_addr, sizeof(this->server_addr));

    if( return_code < 0 ) {
        cout << "Connect() failure! %s\n", strerror(errno);
        return return_code;
    }

    return return_code;
}

मूल प्रश्न से इसका कोई लेना-देना नहीं है।
एंथनी जियोर्जियो

13

उत्तर c89 ध्वज का उपयोग करें जो इस प्रकार है:

 -D_OE_SOCKETS

उदाहरण इस प्रकार है;

 bash-2.03$ c89 -D_OE_SOCKETS [filename].c

अधिक जानकारी के लिए z / OS XLC / C ++ उपयोगकर्ता गाइड में C89 विकल्प देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.