c++ - programmierung - socket() c




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

@Jax: Die Sache mit dem extern "C" ist sehr, sehr wichtig. Wenn eine Header-Datei keine hat (es sei denn, es handelt sich um eine reine C ++ - Header-Datei), müssten Sie ihr #include :

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

Grundsätzlich ist das extern "C" immer dann wichtig, wenn ein C ++ - Programm eine Verknüpfung zu C-basierten Einrichtungen herstellen möchte. 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. Reference.

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

Obwohl ich sys/socket.h mit sys/socket.h , sys/socket.h ich trotzdem Kompilierungsfehler, die darauf sys/socket.h , dass AF_INET nicht definiert ist.

Fehlt mir etwas Offensichtliches oder hängt dies damit zusammen, dass meine Probleme unter z/OS viel komplizierter werden?

Update : Bei weiteren Untersuchungen stellte ich fest, dass es ein #ifdef , auf das ich #ifdef . Anscheinend ist z/OS nur dann glücklich, wenn ich definiere, mit welchem ​​"Typ" von Sockets ich arbeite:

#define _OE_SOCKETS

Ich persönlich habe keine Ahnung, wofür diese _OE_SOCKETS eigentlich _OE_SOCKETS sind. Wenn also z/OS Sockets-Programmierer da draußen sind (Sie alle drei), könnten Sie mir vielleicht einen Überblick über die Funktionsweise geben?

Test App

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Compile / 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 von #ifdef-Anweisungen blockiert.

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

#ifdef __cplusplus
  extern "C" {
#endif

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


Also versuche

#define _OE_SOCKETS

bevor Sie sys / socket.h einbinden


Die Antwort ist die Verwendung des folgenden c89-Flags:

 -D_OE_SOCKETS

Beispiel folgt;

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

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


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

Auch Abschriften setzen diese seltsamen _ als meine Unterstriche.

Sie sollten nur in der Lage sein, eine Abstraktionsklasse um die C-Sockets herum 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;
};

Verfügen Sie dann ü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;
}

Ich hatte keine Probleme mit 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 verwendet habe, geschweige denn darin programmiert bin, kann ich dies nicht definitiv sagen. :-P


Vielleicht möchten Sie einen Blick auf cpp-sockets werfen, einen 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 einen Blick auf die verwendeten Include-Dateien werfen und viele Beispiele für getesteten Code finden, der auf anderen Betriebssystemen gut funktioniert.







zos