जेड / ओएस पर सी ++ में सी सॉकेट एपीआई का उपयोग कैसे करें

मुझे C ++ में ठीक से काम करने के लिए सी सॉकेट एपीआई प्राप्त करने में समस्याएं आ रही हैं। विशेष रूप से, हालांकि मैं sys / socket.h समेत हूं, मुझे अभी भी संकलन समय त्रुटियां मिलती हैं जो मुझे बताती हैं कि AF_INET परिभाषित नहीं किया गया है। क्या मुझे कुछ स्पष्ट याद आ रहा है, या यह इस तथ्य से संबंधित हो सकता है कि मैं z / OS पर यह कोडिंग कर रहा हूं और मेरी समस्याएं अधिक जटिल हैं?


Update: Upon further investigation, I discovered that there is an #ifdef that I'm hitting. Apparently z/OS isn't happy unless I define which "type" of sockets I'm using with:

#define _OE_SOCKETS

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


निश्चित रूप से मैं एक परीक्षण ऐप पोस्ट कर सकते हैं।

#include 

int main()
{
    return AF_INET;
}

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

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

"./inet.C", लाइन 5.16: सीसीएन 5274 (एस) "AF_INET" के लिए नाम लुकअप को घोषणा नहीं मिली।

CCN0797 (I) फ़ाइल के लिए संकलन विफल ./inet.C। ऑब्जेक्ट फ़ाइल नहीं बनाई गई।

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

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

#ifdef __cplusplus
  extern "C" {
#endif

जो मूल रूप से पूरी फ़ाइल encapsulates। यकीन नहीं है कि यह मायने रखता है।

0
जोड़ा संपादित
विचारों: 10

9 उत्तर

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

#include 

int
main()
{
    return AF_INET;
}

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

0
जोड़ा

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

extern "C" {
#include 
// include other similarly non-compliant header files
}

Basically, anytime where a C++ program wants to link to C-based facilities, the extern "C" is vital. In practical terms, it means that the names used in external references will not be mangled, like normal C++ names would. Reference.

0
जोड़ा

जेड / ओएस एक्सएल सी / सी ++ प्रोग्रामिंग गाइड में जेड / ओएस यूनिक्स सिस्टम सर्विसेज सॉकेट सेक्शन का उपयोग करें। सुनिश्चित करें कि आप आवश्यक हेडर फाइलें और उपयुक्त # डिफाईन्स का उपयोग कर रहे हैं।

The link to the doc has changed over the years, but you should be able to get to it easily enough by finding the current location of the Support & Downloads section on ibm.com and searching the documentation by title.

0
जोड़ा

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

#define _OE_SOCKETS

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

0
जोड़ा

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

Take a look at this page:
Compiling and Linking a z/VM C Sockets Program

0
जोड़ा
ज़ेड / ओएस के साथ जेड / वीएम के साथ सामान्य में बहुत कुछ है क्योंकि विंडोज लिनक्स के साथ करता है, इसलिए मैं थोड़ा उलझन में हूं कि आपने यह लिंक क्यों पोस्ट किया है।
जोड़ा लेखक paxdiablo, स्रोत
ध्यान दें कि _OE_SOCKETS मैक्रो दोनों में दिखाई देता है, और ऐसा लगता है कि एक ही उद्देश्य है। जो आश्चर्यजनक नहीं है, क्योंकि शायद आईबीएम दोनों उत्पादों में सॉकेट समर्थन के लिए एक ही कोड बेस का इस्तेमाल करता था। मैं यह कहना नहीं चाहता था कि जेड / वीएम दस्तावेज ज़ेड / ओएस पर लागू होता है, यह मुझे मिला सबसे मामला है।
जोड़ा लेखक Fabio Ceconello, स्रोत
मुझे लगता है कि यह सिर्फ एक संयोग है। जेड / वीएम जेड / ओएस भाषा पर्यावरण उत्पाद का उपयोग नहीं करता है, जो सॉकेट कॉल करने के लिए उपयोग की जाने वाली प्रासंगिक शीर्षलेख फ़ाइलें प्रदान करता है।
जोड़ा लेखक Anthony Giorgio, स्रोत

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

Also markdown put these strange _ as my underscores.

आपको सी सॉकेट के चारों ओर इस तरह के कुछ के साथ एक अमूर्त कक्षा लिखने में सक्षम होना चाहिए:

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;
}
0
जोड़ा
इसका मूल प्रश्न से कोई लेना देना नहीं है।
जोड़ा लेखक Anthony Giorgio, स्रोत

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

0
जोड़ा

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

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

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

प्रारूप

X / ओपन

#define _XOPEN_SOURCE_EXTENDED 1
#include 

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

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

#define _OE_SOCKETS
#include 
#include 

int connect(int socket, struct sockaddr *address, int address_len);
0
जोड़ा

उत्तर c89 ध्वज का उपयोग करता है जो निम्नानुसार है:

 -D_OE_SOCKETS

उदाहरण निम्नानुसार है;

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

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

0
जोड़ा