Frage

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

Obwohl ich mitzähle sys/socket.h, ich erhalte immer noch Fehler bei der Kompilierung, die mir das mitteilen AF_INET ist nicht definiert.

Übersehe ich etwas Offensichtliches oder hängt das damit zusammen, dass es eingeschaltet ist? z/OS macht meine Probleme viel komplizierter?


Aktualisieren:Bei weiteren Nachforschungen stellte ich fest, dass es eine gibt #ifdef dass ich schlage.Scheinbar z/OS ist nicht zufrieden, es sei denn, ich definiere, welchen „Typ“ von Sockets ich verwende mit:

#define _OE_SOCKETS

Nun, ich persönlich habe keine Ahnung, was das ist _OE_SOCKETS ist eigentlich dafür, also wenn überhaupt z/OS Es gibt Sockets-Programmierer (alle drei). Könnten Sie mir vielleicht einen Überblick darüber geben, wie das alles funktioniert?


Test-App

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Kompilierungs-/Link-Ausgabe:

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 irgendwelche #ifdef-Anweisungen blockiert.

Mir ist jedoch aufgefallen, dass darin Folgendes enthalten ist:

#ifdef __cplusplus
  extern "C" {
#endif

was im Grunde die gesamte Datei kapselt.Ich bin mir nicht sicher, ob es wichtig ist.

War es hilfreich?

Lösung

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

Die IBM-Veröffentlichungen sind im Allgemeinen sehr gut, aber man muss sich an ihr Format gewöhnen und wissen, wo man nach einer Antwort suchen kann.Sie werden häufig feststellen, dass eine Funktion, die Sie verwenden möchten, durch ein „Funktionstestmakro“ geschützt ist.

Sie sollten Ihren freundlichen Systemprogrammierer bitten, das 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-Steckdosen

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

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

Andere Tipps

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

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Meiner Meinung nach ist hier wahrscheinlich z/OS der erschwerende Faktor. Da ich jedoch noch nie zuvor z/OS verwendet und schon gar nicht damit programmiert habe, kann ich das nicht definitiv sagen.:-P

Siehe die Verwendung von z/OS UNIX System Services-Sockets Abschnitt im z/OS XL C/C++ Programming Guide.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, Sie sollten jedoch leicht darauf zugreifen können, indem Sie den aktuellen Speicherort des Dokuments ermitteln Abschnitt „Support und Downloads“. An ibm.com und Durchsuchen der Dokumentation nach Titel.

Also versuche

#define _OE_SOCKETS

bevor Sie sys/socket.h einbinden

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

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

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.

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

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

Grundsätzlich gilt: Wann immer ein C++-Programm eine Verbindung zu C-basierten Einrichtungen herstellen möchte, muss die extern "C" es ist lebenswichtig.In der Praxis bedeutet dies, dass die in externen Referenzen verwendeten Namen nicht entstellt werden, wie dies bei normalen C++-Namen der Fall wäre. Referenz.

HAFTUNGSAUSSCHLUSS:Ich bin kein C++-Programmierer, kenne mich aber mit C sehr gut aus.Ich habe diese Anrufe aus einem C -Code angepasst, den ich habe.

Markdown hat auch diese seltsamen _ als meine Unterstriche eingefügt.

Sie sollten einfach in der Lage sein, eine Abstraktionsklasse um die C-Sockets herum zu schreiben, etwa so:

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 verfügen Sie über Methoden zum Öffnen, Schließen und Senden von Paketen über den Socket.

Der offene Aufruf könnte beispielsweise 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;
}

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 unter „C89-Optionen“ im z/OS XLC/C++-Benutzerhandbuch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top