কিভাবে z / OS এ C ++ এ C সকেট API ব্যবহার করবেন

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: CCN5274 (S) "AF_INET" এর জন্য নাম সন্ধানের একটি ঘোষণা পাওয়া যায় নি।

CCN0797 (I) ফাইলের জন্য সংকলন ব্যর্থ ./inet.C অবজেক্ট ফাইল তৈরি করা হয়নি

Sys / sockets.h- এর একটি চেক আমি সংজ্ঞায়িত করবো, এবং যতটা আমি বলতে পারি যে এটি #ifdef বিবৃতি দ্বারা অবরুদ্ধ করা হচ্ছে না।

আমি যদিও এটি নিম্নলিখিত একটি রয়েছে লক্ষ্য করেছি:

#ifdef __cplusplus
  extern "C" {
#endif

যা মূলত সম্পূর্ণ ফাইল encapsulates। নিশ্চিত না হলে এটি গুরুত্বপূর্ণ

0
যোগ সম্পাদিত
মতামত: 7

9 উত্তর

আমি GNU / লিনাক্সে C ++ এ BSD সকেট এপিআই ব্যবহার করে কোন সমস্যা পাইনি। এখানে আমি ব্যবহৃত নমুনা প্রোগ্রাম:

#include 

int
main()
{
    return AF_INET;
}

তাই এই আমার নিতে যে z / OS সম্ভবত জটিল ব্যাপারটি এখানে, তবে, কারণ আমি আগে z / OS ব্যবহার না করেছি, এটি কম প্রোগ্রাম, আমি এই definitively বলতে পারেন না। :-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
যোগ

Z / OS XL C / C ++ প্রোগ্রামিং নির্দেশিকাতে z / OS ইউনিক্স সিস্টেম পরিষেবাদি সকেটস বিভাগটি দেখুন। প্রয়োজনীয় হেডার ফাইল এবং সঠিক #defines ব্যবহার করে তা নিশ্চিত করুন।

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 কেবল সকেট-সম্পর্কিত প্রতীকগুলির সংজ্ঞা সক্ষম / নিষ্ক্রিয় করতে বলে মনে হচ্ছে। এটি কিছু লাইব্রেরিতে অসাধারণ নয় যে এটি করার জন্য ম্যাক্রোগুলির একটি গুচ্ছ আছে, এটি নিশ্চিত করার জন্য যে আপনি অংশগুলি সংকলন / সংযোগ করবেন না, প্রয়োজন নেই। ম্যাক্রো অন্য সকেটের বাস্তবায়নের মান নয়, এটি z / OS- এর জন্য নির্দিষ্ট কিছু বলে মনে হচ্ছে।

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

0
যোগ
জাভাস্ক্রিপ্ট / লিনাক্সের সাথে জাভাস্ক্রিপ্টের মতই z / vm- এর মতই z / om রয়েছে, তাই আমি সেই লিঙ্কটি পোস্ট করার জন্য একটু আস্থাশীল।
যোগ লেখক paxdiablo, উৎস
লক্ষ্য করুন যে _OE_SOCKETS ম্যাক্রোর উভয়তে প্রদর্শিত হয় এবং একই উদ্দেশ্য আছে বলে মনে হয়। যা অবাক হওয়ার কিছু নেই, সম্ভবত IBM উভয় পণ্য মধ্যে সকেট সমর্থনের জন্য একই কোড বেস ব্যবহৃত। আমি বলতে চাইছি না যে Z / VM ডকুমেন্টেশন z / OS- তে প্রযোজ্য, এটি শুধু আমার কাছে সবচেয়ে অনুরূপ কেস।
যোগ লেখক Fabio Ceconello, উৎস
আমি এটা শুধু একটি কাকতালীয় মনে হয়। z / VM z / OS ভাষা পরিবেশ পণ্য ব্যবহার করে না, যা সকেট কলগুলি ব্যবহৃত প্রাসঙ্গিক হেডার ফাইল সরবরাহ করে।
যোগ লেখক Anthony Giorgio, উৎস

অপব্যবহার: আমি C ++ প্রোগ্রামার নই, তবে আমি সত্যিই ভাল জানি C আমি কিছু সি কোড থেকে এই কলগুলি adapated আমি আছে।

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, লিনাক্স, * বিএসডি) এর সাথে কাজ করে। আমি এটা z / OS- এর সাথে কাজ করবে মনে করি না কিন্তু আপনি এটি ব্যবহার করে অন্তর্ভুক্ত ফাইল তাকান করতে পারেন এবং আপনার অন্যান্য অপারেটিং সিস্টেম ভাল কাজ করে পরীক্ষিত কোড অনেক উদাহরণ থাকবে।

0
যোগ

আইবিএম ম্যানুয়েলগুলি একটি কপি রাখুন:

আইবিএম প্রকাশনা সাধারণত ভাল, তবে আপনাকে তাদের ফরম্যাটে ব্যবহার করতে হবে, পাশাপাশি উত্তরটি কোথায় দেখতে হবে তা জানার প্রয়োজন হয়। আপনি প্রায়শই খুঁজে পাবেন যে একটি বৈশিষ্ট্য যা আপনি ব্যবহার করতে চান একটি "বৈশিষ্ট্য পরীক্ষা ম্যাক্রো" দ্বারা সুরক্ষিত হয়

আপনি এক্সেল সি / এ ইনস্টল করার জন্য আপনার বন্ধুত্বপূর্ণ সিস্টেম প্রোগ্রামারকে জিজ্ঞাসা করুন C ++ রান-টাইম লাইব্রেরী রেফারেন্স: ম্যান পেজ আপনার সিস্টেমে। তারপর আপনি সকেট সংযোগ() API- এর জন্য man পৃষ্ঠাটি টানতে "মানুষ সংযোগ" এর মতো জিনিসগুলি করতে পারেন। যখন আমি এটি করি, এই আমি যা দেখি:

বিন্যাসে

এক্স / ওপেন

#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
যোগ