c++ - turtle - socket programming شرح




كيفية استخدام API C socket في C++ على z/OS (6)

أواجه مشكلات في جعل واجهة برمجة تطبيقات مآخذ التوصيل C تعمل بشكل صحيح في نظام C ++ على z/OS .

على الرغم من أنني بما في ذلك sys/socket.h ، ما زلت أحصل على أخطاء وقت الترجمة تخبرني أن AF_INET لم يتم تعريفه.

هل أفتقد شيئًا واضحًا ، أم أن هذا يتعلق بحقيقة أن التواجد على z/OS يجعل مشاكلي أكثر تعقيدًا؟

تحديث : بعد إجراء مزيد من التحقيقات ، اكتشفت أن هناك #ifdef . يبدو أن z/OS ليس سعيدًا إلا إذا قمت بتحديد "نوع" المآخذ التي أستخدمها مع:

#define _OE_SOCKETS

الآن ، ليس لدي أي فكرة عن ماهية هذا _OE_SOCKETS بالفعل ، لذلك إذا كان هناك مبرمجون لمقابس z/OS موجودون ( _OE_SOCKETS 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

الذي يغلف أساسا الملف بأكمله. لست متأكدا إذا كان يهم.


Jax: الشيء extern "C" مهم للغاية. إذا كان ملف الرأس لا يحتوي على ملف ، فعندئذٍ (ما لم يكن ملف رأس C + - فقط) ، فعليك إرفاق #include :

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

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


إخلاء المسئولية: أنا لست مبرمجًا لـ C ++ ، لكنني أعرف C جيدًا. لقد تكيفت هذه المكالمات من بعض الرموز جيم لدي.

وضع التخفيضات أيضًا على هذه الأشياء الغريبة _ كما تؤكد لي.

يجب أن تكون قادرًا على كتابة فصل تجريبي حول مآخذ 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 ++.


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

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


لذا حاول

#define _OE_SOCKETS

قبل أن تشمل تميز الكلية / socket.h


لم أواجه أي مشكلة في استخدام واجهة برمجة تطبيقات مآخذ توصيل BSD في C ++ ، في GNU / Linux. إليك نموذج البرنامج الذي استخدمته:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

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





zos