জেড / ওএসে সি ++ এ সি সকেট এপিআই কীভাবে ব্যবহার করবেন


157

আমি বিষয়ে সঠিকভাবে কাজ করার জন্য সি সকেট এপিআই পেয়ে হচ্ছে C++উপর z/OS

যদিও আমি অন্তর্ভুক্ত করছি sys/socket.h, আমার এখনও পেতে কম্পাইল সময় ত্রুটি আমাকে বলছে যে AF_INETসংজ্ঞায়িত করা হয় না

আমি কি স্পষ্ট কিছু মিস করছি, বা এটি কি এই সম্পর্কিত যে z/OSআমার সমস্যাগুলি আরও জটিল করে তোলে?


আপডেট : আরও তদন্তের পরে, আমি আবিষ্কার করেছি যে এখানে একটি #ifdefহিট করছি। দৃশ্যত z/OSখুশি হয় না যতক্ষণ না আমি কোন "ধরণের" সকেট ব্যবহার করছি তার সাথে:

#define _OE_SOCKETS

এখন এটি আমার পক্ষে ব্যক্তিগতভাবে কোনও ধারণা নেই _OE_SOCKETS, সুতরাং যদি কোনও z/OSসকেট প্রোগ্রামার বাইরে থাকে (আপনারা তিনজনই), সম্ভবত আপনি আমাকে কীভাবে এই সমস্ত কাজ করে তার একটি রুনডাউন দিতে পারেন?


পরীক্ষা অ্যাপ

#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.

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

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

#ifdef __cplusplus
  extern "C" {
#endif

মূলত পুরো ফাইলটি এনক্যাপুলেট করে কোনটি? এটি গুরুত্বপূর্ণ কিনা তা নিশ্চিত নয়।

উত্তর:


86

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

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

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

বিন্যাসে

এক্স / ওপেন

#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;
}

সুতরাং আমার এই গ্রহণটি হ'ল জেড / ওএস সম্ভবত এখানে জটিলতর কারণ, যদিও আমি এর আগে জেড / ওএস আগে কখনও ব্যবহার করি নি, এটিতে খুব কম প্রোগ্রাম করা হয়েছে, আমি এটি নির্দিষ্ট করে বলতে পারি না। :-P


32

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

ডক লিংক বছর ধরে পরিবর্তন হয়েছে, কিন্তু আপনি এর বর্তমান অবস্থান খুঁজে বের করে সহজেই যথেষ্ট এটি পেতে করতে সক্ষম হওয়া উচিত সাপোর্ট & ডাউনলোডগুলি অধ্যায় উপর ibm.com এবং শিরোনাম অনুসারে ডকুমেন্টেশন অনুসন্ধান।


26

_OE_SOCKETS সকেট-সম্পর্কিত প্রতীকগুলির সংজ্ঞা সক্ষম / অক্ষম করার জন্য কেবল প্রদর্শিত হয়েছে। কিছু লাইব্রেরিতে এটি করার জন্য একগুচ্ছ ম্যাক্রোগুলি রাখা অস্বাভাবিক কিছু নয়, আপনি যে অংশগুলি সংকলন / সংযোগ করছেন না তা নিশ্চিত করার জন্য। অন্যান্য সকেট বাস্তবায়নে ম্যাক্রো মানক নয়, এটি z / OS এর সাথে নির্দিষ্ট কিছু বলে মনে হচ্ছে।

এই পৃষ্ঠাটি একবার দেখুন:
সংকলন এবং সংযোগ অ্যাজ / ভিএম সি সকেট প্রোগ্রাম


2
উইন্ডোজ যেমন লিনাক্সের সাথে জেড / ওএসের সাথে জেড / ভিএম এর সাথে অনেক মিল রয়েছে তাই আপনি কেন এই লিঙ্কটি পোস্ট করলেন তাতে আমি কিছুটা বিস্মিত হই।
প্যাক্সডিয়াবলো

খেয়াল করুন যে _OE_SOCKETS ম্যাক্রো উভয়তেই উপস্থিত হয়েছে এবং মনে হয় একই উদ্দেশ্য রয়েছে। যা অবাক করার মতো নয়, যেহেতু সম্ভবত আইবিএম উভয় পণ্যেই সকেট সমর্থনের জন্য একই কোড বেস ব্যবহার করেছিল। আমি বলতে চাইনি যে জেড / ভিএম ডকুমেন্টেশন z / OS এর ক্ষেত্রে প্রযোজ্য, এটি আমার দেখা সর্বাধিক অনুরূপ ঘটনা।
ফ্যাবিও সেকোনলো

1
আমি মনে করি এটি কেবল একটি কাকতালীয় ঘটনা। z / VM z / OS ভাষা পরিবেশ পণ্যটি ব্যবহার করে না, যা সকেট কল করতে ব্যবহৃত হেডারের ফাইল সরবরাহ করে।
অ্যান্টনি জর্জিও

25

তাই চেষ্টা করুন

#define _OE_SOCKETS

সিস / সকেট। অন্তর্ভুক্ত করার আগে


19

আপনি সিপিপি-সকেটগুলি দেখতে পারেন , সকেট সিস্টেম কলগুলির জন্য একটি সি ++ র‌্যাপার। এটি অনেকগুলি অপারেটিং সিস্টেমের সাথে কাজ করে (উইন 32, পসিক্স, লিনাক্স, * বিএসডি)। আমি মনে করি না এটি z / OS এর সাথে কাজ করবে তবে আপনি এটি ব্যবহার করা ফাইলগুলি অন্তর্ভুক্ত করে দেখে নিতে পারেন এবং পরীক্ষিত কোডের অনেকগুলি উদাহরণ পাবেন যা অন্যান্য ওএসগুলিতে ভাল কাজ করে well


18

@ জ্যাক্স: extern "C"বিষয়টি খুব গুরুত্বপূর্ণ। যদি একটি শিরোলেখ ফাইলটিতে না থাকে, তবে (এটি যদি সি ++ না হয় - কেবলমাত্র শিরোনামের ফাইল থাকে), আপনাকে #includeএটি দিয়ে এটি বন্ধ করতে হবে:

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

মূলত, যে কোনও সময় সি ++ প্রোগ্রাম সি-ভিত্তিক সুবিধার সাথে লিঙ্ক করতে চায়, extern "C"অতীব গুরুত্বপূর্ণ। ব্যবহারিক ভাষায়, এর অর্থ হ'ল বাহ্যিক রেফারেন্সগুলিতে ব্যবহৃত নামগুলি সাধারণ সি ++ নামের মতো ম্যাঙ্গেল করা হবে না। রেফারেন্স।


14

অস্বীকৃতি: আমি কোনও সি ++ প্রোগ্রামার নই, তবে আমি সি জানি। আমি আমার কাছে থাকা কিছু সি কোড থেকে এই কলগুলি মানিয়ে নিয়েছি।

এছাড়াও মার্কডাউন এগুলিকে আমার আন্ডারস্কোর হিসাবে আটকায় put

সি সকেটের চারপাশে এই জাতীয় কিছু দিয়ে আপনি কেবল একটি বিমূর্ত শ্রেণি লিখতে সক্ষম হবেন:

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 বিকল্পগুলির সন্ধান করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.