Wie die C-socket-API in C++ auf z/OS
Habe ich Probleme bekommen die C-sockets-API, um richtig zu arbeiten, in C++ auf z/OS
.
Obwohl, ich bin auch sys/socket.h
bekomme ich noch compile-Zeit Fehler, mir zu sagen, dass AF_INET
ist nicht definiert.
Übersehe ich etwas offensichtliches, oder ist dies mit der Tatsache, dass auf der z/OS
macht meine Probleme viel komplizierter?
Update: Bei der weiteren Untersuchung habe ich entdeckt, dass es eine #ifdef
dass ich mich schlagen. Offenbar z/OS
ist nicht glücklich, es sei denn ich definieren, welche "Art" von buchsen, die ich verwende mit:
#define _OE_SOCKETS
Nun, ich persönlich habe keine Ahnung, was diese _OE_SOCKETS
ist eigentlich, also wenn z/OS
Steckdosen-Programmierer gibt (alle 3 von Ihnen), könnten Sie vielleicht geben Sie mir einen überblick, wie das alles funktioniert?
Test-App
#include <sys/socket.h>
int main()
{
return AF_INET;
}
Compile - /Link-Ausgang:
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.
Einen Scheck von sys/sockets.h enthält die definition, die ich brauche, und soweit ich sagen kann, es ist nicht blockiert, von jeder #ifdef-Anweisungen.
Habe ich jedoch bemerkt, enthält es die folgenden:
#ifdef __cplusplus
extern "C" {
#endif
welche kapselt im wesentlichen die gesamte Datei. Nicht sicher, wenn es darauf ankommt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Behalten Sie eine Kopie des IBM-Handbücher praktisch:
IBM Publikationen sind in der Regel sehr gut, aber Sie brauchen, um verwendet werden, um Ihre-format, als auch wissen, wo man suchen nach einer Antwort. Sie finden Häufig, dass eine Funktion, die Sie verwenden möchten, bewacht von einem "feature-test-makro"
Fragen Sie Ihren freundlichen system-Programmierer zu installieren, die XL C/C++ Run-Time Library Reference: Mann Seiten
auf Ihrem system. Dann können Sie Dinge tun, wie "Menschen in Verbindung" nach oben zu ziehen, die man-Seite für den socket connect () - API. Wenn ich das mache, das ist, was ich sehe:
FORMAT
X/Open
Berkeley Sockets
Hatte ich keine Probleme mit der BSD-Socket-API in C++ unter GNU/Linux. Hier ist das Beispielprogramm verwendet habe ich:
Also meine Meinung dazu ist, dass die z/OS ist das wahrscheinlich problematischer Faktor ist hier aber, denn ich habe noch nie verwendet, z/OS vor, viel weniger programmiert, kann ich nicht sagen, dass dies definitiv. 😛
Sehen die unter z/OS UNIX System Services-sockets Abschnitt in der z/OS XL C/C++ Programming Guide. Stellen Sie sicher, dass Sie einschließlich der erforderlichen header-Dateien und die entsprechenden #defines.
Den link zu der doc hat sich über die Jahre verändert, aber Sie sollten in der Lage sein, es leicht genug, durch das finden der aktuellen Position des Support & Downloads auf ibm.com und suchen in der Dokumentation nach Titel.
So versuchen
bevor Sie include sys/socket.h
Den _OE_SOCKETS scheint einfach zu aktivieren/deaktivieren Sie die definition von socket-bezogene Symbole. Es ist nicht ungewöhnlich, dass in einigen Bibliotheken, ein paar Makros zu tun, um sicherzustellen, dass Sie nicht compiling/linking Teile, die nicht benötigt werden. Das makro ist nicht standard in anderen sockets-Implementierungen, es erscheint zu sein etwas bestimmtes zu z/OS.
Werfen Sie einen Blick auf diese Seite:
Kompilieren und linken eines z/VM-C-Steckdosen Programm
Möchten Sie vielleicht einen Blick auf die cpp-Steckdosen, ein C++ - wrapper für die buchsen system fordert. Es funktioniert mit vielen Betriebssystemen (Win32, POSIX, Linux, *BSD). Ich glaube nicht, dass es funktionieren wird mit z/OS, aber Sie können einen Blick in die include-Dateien, die es verwendet, und Sie haben viele Beispiele von code getestet, der funktioniert auch auf anderen Betriebssystemen.
@Jax: Die
extern "C"
Sache Fragen, sehr, sehr viel. Wenn eine header-Datei nicht haben, dann (es sei denn, es ist ein C++-nur die header-Datei), müssten Sie umschließen Ihre#include
mit:Grundsätzlich jederzeit, wo ein C++ - Programm möchte Verbindung zu C-basierten Einrichtungen, die
extern "C"
ist von entscheidender Bedeutung. In der Praxis bedeutet es, dass die Namen in externen Verweise nicht entstellt werden, wie normale C++ - Namen würde. Referenz.DISCLAIMER: ich bin kein C++ Programmierer, aber ich weiß, C ist wirklich gut. Ich
adapated diese Anrufe von irgendwelchen C-code habe ich.
Auch markdown diese seltsamen _ als meine Unterstriche.
Sollten Sie nur in der Lage sein zu schreiben, eine Abstraktion, die Klasse um den C-sockets mit so etwas wie dies:
Dann haben Methoden für das öffnen, schließen, und sendet nach unten den sockel.
Beispielsweise der Aufruf könnte wie folgt Aussehen:
Antwort-ist die Verwendung der c89-flag folgt:
Beispiel folgt;
Weitere Infos für C89-Optionen in der z/OS-XLC/C++ - Benutzer Guide.