Wie die C-Socket-API in C ++ unter z / OS

stimmen
126

Ich habe Probleme wurden mit der C - Sockets API bekommen ++ richtig in C zu arbeiten. Genauer gesagt, obwohl ich mit bin sys/socket.h, bekomme ich noch Zeit , Fehler kompilieren mir zu sagen , die AF_INETnicht definiert ist. Bin ich etwas fehlt offensichtlich, oder könnte dies auf die Tatsache zurückzuführen sein , dass ich diese Codierung mache auf z/OSund meine Probleme sind viel komplizierter?


Update : Bei der weiteren Untersuchung entdeckte ich , dass es eine ist , #ifdefdie ich zu treffen. Offenbar z/OSist nicht glücklich , wenn ich nicht definieren , welche „Art“ von Steckdosen mit Ich verwende:

#define _OE_SOCKETS

Jetzt habe ich persönlich keine Ahnung , was das _OE_SOCKETSist eigentlich für, also wenn keine z/OSSteckdosen Programmierer da draußen sind (alle drei von Ihnen), vielleicht könnten Sie mir einen Überblick darüber , wie das alles funktioniert?


Sicher kann ich einen Test-App veröffentlichen.

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Kompilieren / Link-Ausgang:

cxx -Wc, xplink -Wl, xplink -o inet_test inet.C

./inet.C, line 5.16: CCN5274 (S) Die Namenssuche für AF_INET fand keine Erklärung.

CCN0797 (I) Compilation fehlgeschlagen für Datei ./inet.C. Objektdatei nicht erstellt.

Eine Überprüfung von sys / sockets.h enthält die Definition, die ich brauche, und soweit ich das beurteilen kann, ist es nicht durch #ifdef Aussagen blockiert.

Ich habe jedoch festgestellt, es enthält eine der folgenden:

#ifdef __cplusplus
  extern C {
#endif

die kapselt im Grunde die gesamte Datei. Nicht sicher, ob es darauf ankommt.

Veröffentlicht am 01/08/2008 um 13:13
quelle vom benutzer
In anderen Sprachen...                            


9 antworten

stimmen
71

Halten Sie eine Kopie des IBM Handbücher praktisch:

Die IBM-Publikationen sind in der Regel sehr gut, aber Sie müssen auf ihr Format gewöhnen, sowie zu wissen, wo nach einer Antwort zu suchen. Sie werden oft feststellen, dass eine Funktion, die Sie verwenden möchten, durch ein „Feature-Test-Makro“ bewacht

Sie sollten Ihre freundlichen Systemprogrammierer bitten , das installieren XL C / C ++ Laufzeitbibliothek Referenz: Man Pages auf Ihrem System. Dann können Sie tun Dinge wie „Mann verbinden“ , um die man - Seite für die Steckdose anschließen () API hochziehen. Wenn ich das tun, ist es das , was ich sehe:

FORMAT

X / Open

#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>

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

Berkeley Sockets

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

int connect(int socket, struct sockaddr *address, int address_len);
Beantwortet am 18/09/2009 um 12:17
quelle vom benutzer

stimmen
34

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

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Also meine Meinung dazu ist, dass z / OS ist wahrscheinlich der erschwerender Faktor ist hier jedoch, weil ich noch nie zuvor z / OS verwendet haben, viel weniger in sie programmiert, kann ich dies nicht definitiv sagen. :-P

Beantwortet am 01/08/2008 um 13:22
quelle vom benutzer

stimmen
29

Siehe die Verwendung von z / O UNIX System Services - Buchsen Abschnitt in dem z / O XL C / C ++ Programming Guide. Stellen Sie sicher , dass Sie die notwendigen Header - Dateien sind einschließlich und unter Verwendung der entsprechenden #defines.

Der Link zum doc hat sich im Laufe der Jahre verändert, aber man sollte leicht genug , um es zu bekommen, indem er die aktuelle Lage der Suche nach Support & Downloads Abschnitt auf ibm.com und Suche in der Dokumentation nach Titel.

Beantwortet am 15/05/2009 um 06:27
quelle vom benutzer

stimmen
23

Die _OE_SOCKETS scheint einfach zu sein, um die Definition der Buchse bezogene Symbole zu aktivieren / deaktivieren. Es ist nicht ungewöhnlich in einigen Bibliotheken eine Reihe von Makros zu haben, das zu tun, um sicherzustellen, dass Sie nicht kompilieren / Verbindungsteilen nicht benötigt. Das Makro in anderen Buchsen-Implementierungen nicht Standard ist, scheint es, etwas Bestimmtes zu z / OS zu sein.

Werfen Sie einen Blick auf dieser Seite:
Kompilieren und Linken von z / VM - C Sockets - Programm

Beantwortet am 11/10/2008 um 01:38
quelle vom benutzer

stimmen
23

Also versuche

#define _OE_SOCKETS

bevor Sie sys include / socket.h

Beantwortet am 21/09/2008 um 13:37
quelle vom benutzer

stimmen
17

Sie können einen Blick auf nehmen wollen cpp-Buchsen , eine C ++ Wrapper für die Buchsen Systemaufrufe. Es arbeitet mit vielen Betriebssystemen (Win32, POSIX, Linux, * BSD). Ich glaube nicht , es mit z / OS arbeiten , aber Sie können einen Blick auf die Dateien sind es verwendet , und Sie werden viele Beispiele getesteter Code haben, der auch auf anderen Betriebssystemen funktioniert.

Beantwortet am 07/09/2008 um 09:21
quelle vom benutzer

stimmen
15

@Jax: Die extern "C"Sache Angelegenheiten, sehr , sehr viel. Wenn eine Header - Datei nicht ein, so ist (es sei denn , es eine C ++ ist - nur Header - Datei), würden Sie umschließen müssen #includemit ihm:

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

Im Grunde genommen, zu jeder Zeit , wo ein C ++ Programm will C-basierte Einrichtungen verbinden, das extern "C"ist lebenswichtig. In der Praxis bedeutet dies , dass die in externen Referenzen verwendeten Namen werden nicht verstümmelt werden, wie normale C ++ Namen würden. Referenz.

Beantwortet am 01/08/2008 um 14:40
quelle vom benutzer

stimmen
11

Die Antwort ist die C89-Flag verwenden, der folgt:

 -D_OE_SOCKETS

Beispiel folgt;

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

Für weitere Informationen suchen Sie nach C89-Optionen in der z / OS XLC / C ++ Benutzerhandbuch.

Beantwortet am 11/04/2011 um 19:59
quelle vom benutzer

stimmen
11

HAFTUNGSAUSSCHLUSS: Ich bin kein Programmierer C ++, aber ich weiß, C wirklich gut. Ich adapated diese Anrufe von einem C-Code ich habe.

Auch Abschlag diese seltsamen _ wie meine Unterstrichen setzen.

Sie sollten nur in der Lage sein, eine Abstraktionsklasse um die C-Steckdosen mit so etwas 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 Methoden zum Öffnen, Schließen und Senden von Paketen auf der Buchse.

Zum Beispiel könnte der offene Aufruf wie folgt 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;
}
Beantwortet am 29/08/2008 um 19:56
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more