سؤال

أواجه مشكلات في الحصول على ج مآخذ API للعمل بشكل صحيح في 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/مآخذ.ساعة لا تشمل تعريف أريد ، بقدر ما استطيع ان اقول انه لا يتم حظره من قبل أي #ifdef البيانات.

لكنني لاحظت أنه يحتوي على التالي:

#ifdef __cplusplus
  extern "C" {
#endif

والتي تلخص أساسا الملف بأكمله.ليس متأكدا مما إذا كان من المسائل.

هل كانت مفيدة؟

المحلول

الاحتفاظ بنسخة من IBM أدلة مفيد:

IBM المنشورات هي عموما جيدة جدا ، ولكن عليك أن تعتاد على شكلها ، وكذلك معرفة من أين للبحث عن إجابة.سوف تجد في كثير من الأحيان أن الميزة التي تريد استخدامها يخضع لحراسة من قبل "في اختبار ميزة الماكرو"

يجب عليك أن تسأل الخاص بك ودية نظام مبرمج لتثبيت XL C/C++ مكتبة وقت التشغيل المرجعية:صفحات الرجل على النظام الخاص بك.ثم يمكنك أن تفعل أشياء مثل "رجل الاتصال" لسحب ما يصل الرجل صفحة مأخذ توصيل() API.عندما تفعل ذلك, هذا هو ما أراه:

شكل

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);

نصائح أخرى

لا توجد لدي مشكلة في استخدام BSD مآخذ API في C++, في جنو/لينكس.هنا هو نموذج البرنامج كنت:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

حتى بلدي يأخذ على ذلك هو أن z/OS هو على الأرجح عوامل التعقيد هنا ، ومع ذلك لأني لم تستخدم z/OS قبل أقل بكثير المبرمجة في ذلك, لا أستطيع أن أقول هذا نهائيا.:-P

ترى باستخدام z/OS نظام يونكس الخدمات مآخذ القسم في z/OS XL C/C++ البرمجة دليل.تأكد من أنك بما في ذلك ما يلزم رأس الملفات باستخدام مناسبة #تعرف.

رابط الطبيب قد تغير على مر السنين ، ولكن يجب أن تكون قادرة على الحصول عليها بسهولة بما فيه الكفاية من خلال إيجاد الموقع الحالي الدعم و قسم التحميل على ibm.com والبحث في الوثائق حسب العنوان.

وذلك في محاولة

#define _OE_SOCKETS

قبل أن تشمل sys/مأخذ.ح

على _OE_SOCKETS يبدو ببساطة إلى تمكين/تعطيل تعريف مأخذ على الرموز ذات الصلة.فإنه ليس من غير المألوف في بعض المكتبات مجموعة من وحدات الماكرو إلى فعل ذلك, للتأكد من أن كنت لا تجميع/ربط أجزاء لا حاجة.الماكرو هو المعيار في مآخذ تطبيقات, يبدو أن شيء محدد z/OS.

نلقي نظرة على هذه الصفحة:
تجميع و ربط z/VM ج مآخذ البرنامج

قد ترغب في إلقاء نظرة على cpp-المقابس, C++ المجمع مآخذ نظام المكالمات.يعمل مع العديد من أنظمة التشغيل (Win32 ، POSIX, لينكس, *BSD).أنا لا أعتقد أنه سوف يعمل مع z/OS ولكن يمكنك أن تأخذ نظرة على ملفات التضمين كان يستخدم سيكون لديك العديد من الأمثلة اختبار التعليمات البرمجية التي تعمل بشكل جيد على غيرها من برمجيات المصدر المفتوح.

@جاكس:على extern "C" شيء يهم جدا جدا.إذا كان ملف رأس لا يملك أحد ، ثم (إلا إذا كانت C++فقط ملف الرأس), عليك أن أرفق بك #include مع ذلك:

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

في الأساس, في أي وقت حيث C++ برنامج يرغب في الارتباط ج-القائمة على المرافق ، extern "C" هو أمر حيوي.ومن الناحية العملية ، فإن ذلك يعني أن الأسماء المستخدمة في المراجع الخارجية لن تكون مشوهة ، مثل العادي C++ أسماء. المرجعية.

تنويه:أنا لست مبرمج C++, ومع ذلك أنا أعرف C بشكل جيد حقا.أنا adapated هذه الدعوات من بعض التعليمات البرمجية 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;
}

الجواب هو استخدام c89 العلم أن يتبع:

 -D_OE_SOCKETS

المثال يلي ؛

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

لمزيد من المعلومات ابحث عن C89 الخيارات في z/OS XLC/C++ دليل المستخدم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top