Hoe de C socket API gebruiken in C ++ op z / OS

stemmen
126

Ik heb met problemen om de C sockets API om goed in C werken ++. In het bijzonder, hoewel ik ook sys/socket.h, ik krijg nog steeds compileren fouten me te vertellen dat AF_INETniet is gedefinieerd. Mis ik iets voor de hand liggende, of kan dit te maken hebben met het feit dat ik ben bezig met deze codering op z/OSen mijn problemen zijn veel ingewikkelder?


Update : Bij nader onderzoek ontdekte ik dat er een #ifdefdat ik te raken. Blijkbaar z/OSis niet gelukkig tenzij ik bepalen welke type van sockets Ik gebruik met:

#define _OE_SOCKETS

Nu, ik persoonlijk heb geen idee wat dit _OE_SOCKETSis eigenlijk voor, dus als geen z/OSstopcontacten programmeurs zijn die er zijn (alle 3 van u), misschien kunt u me een overzicht van hoe dit allemaal werkt geven?


Zeker dat ik kan posten een test app.

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Compile / Link Output:

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

./inet.C, regel 5.16: CCN5274 (S) Het lookup naam voor AF_INET leverde geen verklaring vinden.

CCN0797 (I) Compilatie mislukt voor file ./inet.C. Object bestand niet gemaakt.

Een controle van sys / sockets.h doet onder meer de afbakening ik nodig heb, en voor zover ik kan vertellen, is het niet wordt geblokkeerd door een #ifdef statements.

Ik heb echter gemerkt dat het bevat een van de volgende:

#ifdef __cplusplus
  extern C {
#endif

die kapselt eigenlijk de hele bestand. Niet zeker of het er toe doet.

De vraag is gesteld op 01/08/2008 om 13:13
bron van user
In andere talen...                            


9 antwoorden

stemmen
34

Ik heb geen moeite met behulp van de BSD sockets API in C ++, in GNU / Linux gehad. Hier is de steekproef programma dat ik gebruikte:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Dus mijn mening hierover is dat z / OS is waarschijnlijk de complicerende factor hier, echter, omdat ik z / OS nooit eerder hebt gebruikt, laat staan ​​geprogrammeerd in het, ik kan dit niet definitief zeggen. :-P

antwoordde op 01/08/2008 om 13:22
bron van user

stemmen
15

@Jax: Het extern "C"ding kwesties, heel erg veel. Als een header bestand niet hebt, dan is (tenzij het een C ++ - alleen header-bestand), dan zou je je te voegen #includemet het:

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

Kortom, op elk moment, waar een C-programma ++ wil koppelen aan C-gebaseerde faciliteiten, het extern "C"is van vitaal belang. In de praktijk betekent dit dat de namen die worden gebruikt in externe referenties niet gemangeld zal zijn, zoals normale C ++ namen zou doen. Referentie.

antwoordde op 01/08/2008 om 14:40
bron van user

stemmen
11

DISCLAIMER: Ik ben geen C ++ programmeur, maar ik weet C heel goed. Ik adapated deze oproepen van een aantal C-code die ik heb.

Ook markdown deze vreemde _ zetten zoals mijn underscores.

Je moet gewoon in staat zijn om een ​​abstractie klasse te schrijven rond de C-aansluitingen met iets als dit:

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

Dan hebben methoden voor het openen, sluiten, en het verzenden van pakketten langs de socket.

Bijvoorbeeld, zou de open oproep er ongeveer zo uitzien:

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;
}
antwoordde op 29/08/2008 om 19:56
bron van user

stemmen
17

Misschien wilt u een kijkje te nemen cpp-sockets , een C ++ wrapper voor de sockets system calls. Het werkt met veel besturingssystemen (Win32, POSIX, Linux, * BSD). Ik denk niet dat het zal werken met z / OS, maar u kunt een kijkje nemen op de include bestanden die het gebruikt en je zult vele voorbeelden van geteste code die goed werkt op andere besturingssystemen hebben.

antwoordde op 07/09/2008 om 09:21
bron van user

stemmen
23

Dus probeer

#define _OE_SOCKETS

voordat je onder andere sys / socket.h

antwoordde op 21/09/2008 om 13:37
bron van user

stemmen
23

De _OE_SOCKETS lijkt eenvoudig in- / uitschakelen definitie van socket gerelateerde symbolen. Het is niet ongewoon in sommige bibliotheken om een ​​bos van macro's om dat te doen, om ervoor te zorgen dat je niet compileren / link van onderdelen niet nodig. De macro is niet standaard in andere sockets implementaties, lijkt het iets specifiek voor z / OS.

Neem een kijkje op deze pagina:
compileren en koppelen z / VM C Sockets Program

antwoordde op 11/10/2008 om 01:38
bron van user

stemmen
29

Zie Met behulp van z / OS UNIX System Services aansluitingen sectie in de z / OS XL C / C ++ Programming Guide. Zorg ervoor dat je met inbegrip van de benodigde header bestanden en met de juiste #defines.

De link naar het document is veranderd door de jaren heen, maar je moet in staat zijn om het gemakkelijk genoeg te krijgen door het vinden van de huidige locatie van de afdeling Support & Downloads op ibm.com en het doorzoeken van de documentatie op titel.

antwoordde op 15/05/2009 om 06:27
bron van user

stemmen
71

Bewaar een kopie van de IBM handboeken handig:

De IBM publicaties zijn over het algemeen heel goed, maar je moet wennen aan het formaat, evenals weten waar je moet zoeken naar een antwoord. Je zult vaak dat een functie die u wilt gebruiken, wordt bewaakt vinden door een "feature-test macro"

U moet uw vriendelijke systeem programmeur vragen om de installatie van XL C / C ++ Run-Time Library Referentie: Man Pagina's op uw systeem. Dan kunt u doen dingen als "man aansluiten" op te trekken van de man-pagina voor de aansluiting aan te sluiten () API. Als ik dat doe, dit is wat ik zie:

FORMAAT

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);
antwoordde op 18/09/2009 om 12:17
bron van user

stemmen
11

Het antwoord is gebruik maken van de C89 vlag die volgt:

 -D_OE_SOCKETS

Voorbeeld volgt;

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

Voor meer informatie kijk naar C89 Opties in leidraad voor de z / OS XLC / C ++ gebruikershandleiding.

antwoordde op 11/04/2011 om 19:59
bron van user

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