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 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:
#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. 😛
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
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.
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
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.
14251800cookie-checkVerwendung der C-Socket-API in C++ unter z/OSyes
Die erste C++-Frage zu Stack Overflow
– Saaransh Garg
30. Juli 2021 um 14:37 Uhr