Verwendung der C-Socket-API in C++ unter z/OS

Lesezeit: 5 Minuten

Benutzeravatar von Jax
Jax

Ich habe Probleme damit, die C-Sockets-API in C++ unter z/OS ordnungsgemäß zum Laufen zu bringen.

Obwohl ich darunter bin sys/socket.hbekomme ich immer noch Kompilierzeitfehler, die mir das sagen AF_INET ist nicht definiert.

Übersehe ich etwas Offensichtliches, oder hängt das damit zusammen, dass meine Probleme unter z/OS viel komplizierter werden?

Ich habe entdeckt, dass es eine gibt #ifdef dass ich schlage. Anscheinend ist z / OS nicht glücklich, wenn ich nicht definiere, welchen “Typ” von Sockets ich verwende:

#define _OE_SOCKETS

Nun, ich persönlich habe keine Ahnung, was das ist _OE_SOCKETS ist eigentlich für, also wenn es da draußen irgendwelche z/OS-Socket-Programmierer gibt (alle 3), könnten Sie mir vielleicht einen Überblick geben, wie das alles funktioniert?

Test-App

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Ausgabe kompilieren/linken:

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.

Eine Überprüfung von sys/sockets.h enthält die von mir benötigte Definition, und soweit ich das beurteilen kann, wird sie von niemandem blockiert #ifdef Aussagen.

Ich habe jedoch festgestellt, dass es Folgendes enthält:

#ifdef __cplusplus
  extern "C" {
#endif

die im Grunde die gesamte Datei kapselt? Nicht sicher, ob es wichtig ist.

  • Die erste C++-Frage zu Stack Overflow

    – Saaransh Garg

    30. Juli 2021 um 14:37 Uhr


Benutzeravatar von Anthony Giorgio
Antonius Giorgio

Halten Sie eine Kopie der IBM-Handbücher bereit:

Die IBM-Veröffentlichungen sind im Allgemeinen sehr gut, aber Sie müssen sich an ihr Format gewöhnen und wissen, wo Sie nach einer Antwort suchen müssen. Sie werden ziemlich oft feststellen, dass eine Funktion, die Sie verwenden möchten, von einem “Funktionstestmakro” geschützt wird.

Sie sollten Ihren freundlichen Systemprogrammierer bitten, die zu installieren Referenz zur XL C/C++-Laufzeitbibliothek: Manpages
auf Ihrem System. Dann können Sie Dinge wie “man connect” tun, um die Manpage für die socket connect() API aufzurufen. Wenn ich das mache, sehe ich Folgendes:

FORMAT

X/Öffnen

#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>

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

Berkeley-Buchsen

#define _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>

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

Ich hatte keine Probleme bei der Verwendung der BSD-Sockets-API in C++, in GNU/Linux. Hier ist das Beispielprogramm, das ich verwendet habe:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Meine Meinung dazu ist also, dass z/OS hier wahrscheinlich der erschwerende Faktor ist, aber da ich z/OS noch nie zuvor verwendet, geschweige denn darin programmiert habe, kann ich das nicht definitiv sagen. 😛

Benutzeravatar von Robert Groves
Robert Grove

Siehe die Verwenden von z/OS UNIX System Services-Sockets Abschnitt im Programmierhandbuch für z/OS XL C/C++. Stellen Sie sicher, dass Sie die erforderlichen Header-Dateien einschließen und die entsprechenden #defines verwenden.

Der Link zum Dokument hat sich im Laufe der Jahre geändert, aber Sie sollten leicht genug darauf zugreifen können, indem Sie den aktuellen Speicherort des Dokuments finden Bereich Support & Downloads an ibm.com und Durchsuchen der Dokumentation nach Titel.

Also versuche

#define _OE_SOCKETS

bevor Sie sys/socket.h einbinden

Benutzeravatar von Fabio Ceconello
Fabio Ceconello

Das _OE_SOCKETS scheint einfach dazu da zu sein, die Definition von Socket-bezogenen Symbolen zu aktivieren/deaktivieren. In manchen Bibliotheken ist es nicht ungewöhnlich, dafür eine Reihe von Makros zu haben, um sicherzustellen, dass Sie keine Teile kompilieren/verlinken, die nicht benötigt werden. Das Makro ist in anderen Socket-Implementierungen nicht standardmäßig, es scheint etwas Spezifisches für z/OS zu sein.

Schauen Sie sich diese Seite an:
Kompilieren und Linken eines z/VM C Sockets-Programms

  • z/OS hat mit z/VM genauso viel gemeinsam wie Windows mit Linux, daher bin ich etwas verwirrt, warum Sie diesen Link gepostet haben.

    – paxdiablo

    26. Februar 2009 um 9:14 Uhr

  • Beachten Sie, dass das Makro _OE_SOCKETS in beiden erscheint und denselben Zweck zu haben scheint. Was nicht verwundert, da IBM wohl in beiden Produkten die gleiche Codebasis für die Socket-Unterstützung verwendet hat. Ich wollte nicht sagen, dass die z/VM-Dokumentation für z/OS gilt, es ist nur der ähnlichste Fall, den ich gefunden habe.

    – Fabio Ceconello

    6. Juni 2009 um 0:09 Uhr

  • Ich denke, es ist nur ein Zufall. z/VM verwendet nicht das Produkt z/OS Language Environment, das die relevanten Header-Dateien für Socket-Aufrufe bereitstellt.

    – Antonius Giorgio

    18. September 2009 um 11:19 Uhr

@Jax: Die extern "C" Sache zählt, sehr, sehr viel. Wenn eine Header-Datei keine hat, dann (es sei denn, es handelt sich um eine reine C++-Header-Datei), müssten Sie Ihre einschließen #include damit:

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

Grundsätzlich immer dann, wenn ein C++-Programm eine Verbindung zu C-basierten Einrichtungen herstellen möchte extern "C" es ist lebenswichtig. Praktisch bedeutet dies, dass die in externen Referenzen verwendeten Namen nicht wie normale C++-Namen verstümmelt werden. Bezug.

  • z/OS hat mit z/VM genauso viel gemeinsam wie Windows mit Linux, daher bin ich etwas verwirrt, warum Sie diesen Link gepostet haben.

    – paxdiablo

    26. Februar 2009 um 9:14 Uhr

  • Beachten Sie, dass das Makro _OE_SOCKETS in beiden erscheint und denselben Zweck zu haben scheint. Was nicht verwundert, da IBM wohl in beiden Produkten die gleiche Codebasis für die Socket-Unterstützung verwendet hat. Ich wollte nicht sagen, dass die z/VM-Dokumentation für z/OS gilt, es ist nur der ähnlichste Fall, den ich gefunden habe.

    – Fabio Ceconello

    6. Juni 2009 um 0:09 Uhr

  • Ich denke, es ist nur ein Zufall. z/VM verwendet nicht das Produkt z/OS Language Environment, das die relevanten Header-Dateien für Socket-Aufrufe bereitstellt.

    – Antonius Giorgio

    18. September 2009 um 11:19 Uhr

Federicos Benutzeravatar
Federico

Vielleicht möchten Sie einen Blick darauf werfen cpp-sockets, ein C++-Wrapper für die Sockets-Systemaufrufe. Es funktioniert mit vielen Betriebssystemen (Win32, POSIX, Linux, *BSD). Ich glaube nicht, dass es mit z/OS funktionieren wird, aber Sie können einen Blick auf die verwendeten Include-Dateien werfen und Sie werden viele Beispiele für getesteten Code haben, der auf anderen Betriebssystemen gut funktioniert.

1425180cookie-checkVerwendung der C-Socket-API in C++ unter z/OS

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy