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

Translate

Ich habe Probleme damit, dass die C-Sockets-API in C ++ ordnungsgemäß funktioniertz/OS.

Obwohl ich mit einbeziehesys/socket.hIch bekomme immer noch Fehler bei der Kompilierung, die mir das sagenAF_INETist nicht definiert.

Vermisse ich etwas Offensichtliches oder hängt dies mit der Tatsache zusammen, dass ich eingeschaltet bin?z/OSmacht meine Probleme viel komplizierter?


Aktualisieren: Bei weiteren Untersuchungen stellte ich fest, dass es eine gibt#ifdefdass ich treffe. Offenbarz/OSist nicht glücklich, wenn ich nicht definiere, mit welchem "Typ" von Sockets ich arbeite:

#define _OE_SOCKETS

Nun, ich persönlich habe keine Ahnung, was das ist_OE_SOCKETSist eigentlich für, also wenn überhauptz/OSSockets-Programmierer sind da draußen (Sie alle drei). Vielleicht könnten Sie mir einen Überblick darüber geben, wie das alles funktioniert?


App testen

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Ausgabe kompilieren / verknüpfen:

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 Definition, die ich benötige, und soweit ich das beurteilen kann, wird sie nicht durch # ifdef-Anweisungen blockiert.

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

#ifdef __cplusplus
  extern "C" {
#endif

Das kapselt im Grunde die gesamte Datei. Ich bin mir nicht sicher, ob es darauf ankommt.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

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 häufig feststellen, dass eine Funktion, die Sie verwenden möchten, durch ein "Feature-Test-Makro" geschützt wird.

Sie sollten Ihren freundlichen Systemprogrammierer bitten, das zu installierenXL C / C ++ - Laufzeitbibliotheksreferenz: Man Pagesauf Ihrem System. Anschließend können Sie beispielsweise "man connect" ausführen, 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-Steckdosen

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

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

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

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Ich gehe davon aus, dass z / OS hier wahrscheinlich der komplizierende Faktor ist, da ich z / OS noch nie zuvor verwendet habe, geschweige denn darin programmiert, kann ich dies nicht definitiv sagen. :-P

Quelle
Translate

Siehe dieVerwenden von z / OS UNIX System Services-SocketsAbschnitt im z / OS XL C / C ++ - Programmierhandbuch. 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 in der Lage sein, leicht genug darauf zuzugreifen, indem Sie den aktuellen Speicherort des Dokuments ermittelnSupport & Downloads Bereichaufibm.comund Durchsuchen der Dokumentation nach Titel.

Quelle
Translate

Also versuche

#define _OE_SOCKETS

bevor Sie sys / socket.h einschließen

Quelle
Translate

Das _OE_SOCKETS scheint einfach zu sein, um die Definition von Socket-bezogenen Symbolen zu aktivieren / deaktivieren. In einigen Bibliotheken ist es nicht ungewöhnlich, dass eine Reihe von Makros vorhanden sind, um sicherzustellen, dass Sie keine nicht benötigten Teile kompilieren / verknüpfen. Das Makro ist in anderen Sockets-Implementierungen nicht Standard, es scheint etwas Spezifisches für z / OS zu sein.

Schauen Sie sich diese Seite an:
Kompilieren und Verknüpfen des az / VM C-Sockets-Programms

Quelle
Translate

Vielleicht möchten Sie einen Blick darauf werfenCPP-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 funktioniert, aber Sie können sich die verwendeten Include-Dateien ansehen und Sie werden viele Beispiele für getesteten Code haben, der auf anderen Betriebssystemen gut funktioniert.

Quelle
Translate

@Jax: Dieextern "C"Sache ist sehr, sehr wichtig. Wenn eine Header-Datei keine hat, müssen Sie (es sei denn, es handelt sich nur um eine C ++ - nur Header-Datei) Ihre einschließen#includedamit:

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

Grundsätzlich ist das C ++ - Programm jederzeit verfügbar, wenn eine Verknüpfung zu C-basierten Einrichtungen hergestellt werden sollextern "C"es ist lebenswichtig. In der Praxis bedeutet dies, dass die in externen Referenzen verwendeten Namen nicht wie normale C ++ - Namen entstellt werden.Referenz.

Quelle
Translate

HAFTUNGSAUSSCHLUSS: Ich bin kein C ++ - Programmierer, aber ich kenne C sehr gut. Ich habe diese Aufrufe von einem C-Code angepasst, den ich habe.

Auch Markdown setzen diese seltsamen _ als meine Unterstriche.

Sie sollten nur in der Lage sein, eine Abstraktionsklasse um die C-Sockets zu schreiben:

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

Dann haben Sie Methoden zum Öffnen, Schließen und Senden von Paketen über den Socket.

Zum Beispiel könnte der offene Anruf ungefähr so aussehen:

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;
}
Quelle
Translate

Die Antwort lautet: Verwenden Sie das folgende c89-Flag:

 -D_OE_SOCKETS

Beispiel folgt;

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

Weitere Informationen finden Sie im z / OS XLC / C ++ - Benutzerhandbuch unter C89-Optionen.

Quelle