Vra

Ek ondervind probleme om die C-sockets API behoorlik te laat werk in C++ z/OS.

Alhoewel ek insluit sys/socket.h, Ek kry steeds samestellingstydfoute wat my dit vertel AF_INET is nie gedefinieer nie.

Mis ek iets voor die hand liggend, of hou dit verband met die feit dat aan wees z/OS maak my probleme baie meer ingewikkeld?


Opdateer:By verdere ondersoek het ek ontdek dat daar 'n #ifdef dat ek slaan.Blykbaar z/OS is nie gelukkig nie, tensy ek definieer met watter "tipe" voetstukke ek gebruik:

#define _OE_SOCKETS

Nou, ek persoonlik het geen idee wat dit _OE_SOCKETS is eintlik vir, so indien enige z/OS socket-programmeerders is daar buite (al 3 van julle), miskien kan jy vir my 'n oorsig gee van hoe dit alles werk?


Toets App

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Samestel/skakel afvoer:

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.

'n Kontrole van sys/sockets.h bevat wel die definisie wat ek nodig het, en sover ek kan sien, word dit nie deur enige #ifdef-stellings geblokkeer nie.

Ek het egter opgemerk dat dit die volgende bevat:

#ifdef __cplusplus
  extern "C" {
#endif

wat basies die hele lêer inkapsuleer.Nie seker of dit saak maak nie.

Was dit nuttig?

Oplossing

Hou 'n afskrif van die IBM-handleidings byderhand:

Die IBM-publikasies is oor die algemeen baie goed, maar jy moet gewoond raak aan hul formaat, asook om te weet waar om 'n antwoord te soek.Jy sal baie dikwels vind dat 'n kenmerk wat jy wil gebruik, bewaak word deur 'n "kenmerktoetsmakro"

Jy moet jou vriendelike stelselprogrammeerder vra om die XL C/C++ Run-Time Library Verwysing:Man Bladsye op jou stelsel.Dan kan jy dinge soos "man connect" doen om die man-bladsy vir die socket connect() API op te trek.Wanneer ek dit doen, is dit wat ek sien:

FORMAAT

X/oop

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

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

Berkeley-sokke

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

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

Ander wenke

Ek het geen probleme gehad om die BSD-sockets API in C++ in GNU/Linux te gebruik nie.Hier is die voorbeeldprogram wat ek gebruik het:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

So my siening hieroor is dat z/OS waarskynlik die kompliserende faktor hier is, maar omdat ek nog nooit z/OS voorheen gebruik het nie, nog minder daarin geprogrammeer, kan ek dit nie definitief sê nie.:-P

Sien die Gebruik z/OS UNIX System Services voetstukke afdeling in die z/OS XL C/C++ Programmeringsgids.Maak seker dat jy die nodige koplêers insluit en die toepaslike #defines gebruik.

Die skakel na die dokument het oor die jare verander, maar jy behoort dit maklik genoeg te kan kry deur die huidige ligging van die Ondersteuning en aflaai afdeling aan ibm.com en soek die dokumentasie volgens titel.

So probeer

#define _OE_SOCKETS

voordat jy sys/socket.h insluit

Die _OE_SOCKETS blyk eenvoudig te wees om die definisie van sokverwante simbole te aktiveer/deaktiveer.Dit is nie ongewoon in sommige biblioteke om 'n klomp makro's te hê om dit te doen, om te verseker dat jy nie dele saamstel/koppel wat nie nodig is nie.Die makro is nie standaard in ander voetstukke-implementasies nie, dit blyk iets spesifiek vir z/OS te wees.

Kyk gerus na hierdie bladsy:
Samestelling en koppel van 'n z/VM C Sockets Program

Jy sal dalk wil kyk na cpp-sockets, 'n C ++ omhulsel vir die voetstukke stelsel oproepe.Dit werk met baie bedryfstelsels (Win32, POSIX, Linux, *BSD).Ek dink nie dit sal met z/OS werk nie, maar jy kan kyk na die insluit-lêers wat dit gebruik en jy sal baie voorbeelde hê van getoetste kode wat goed op ander bedryfstelsels werk.

@Jax:Die extern "C" ding maak saak, baie baie.As 'n koplêer nie een het nie, dan (tensy dit 'n slegs C++-koplêer is), moet jy jou #include daarmee saam:

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

Basies, enige tyd waar 'n C++-program na C-gebaseerde fasiliteite wil skakel, die extern "C" noodsaaklik is.In praktiese terme beteken dit dat die name wat in eksterne verwysings gebruik word nie vermink sal word nie, soos normale C++ name sou. Verwysing.

VRYWARING:Ek is nie 'n C++ programmeerder nie, maar ek ken C baie goed.Ek het hierdie oproepe aangepas van 'n C -kode wat ek het.

Ook markdown plaas hierdie vreemde _ as my onderstreping.

Jy behoort net 'n abstraksieklas rondom die C-voetstukke te kan skryf met iets soos hierdie:

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

Het dan metodes om pakkies oop te maak, toe te maak en in die sok af te stuur.

Byvoorbeeld, die oop oproep kan iets soos volg lyk:

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 antwoord is gebruik die c89 vlag wat volg:

 -D_OE_SOCKETS

Voorbeeld volg;

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

Vir meer inligting, kyk vir C89-opsies in die z/OS XLC/C++-gebruikersgids.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top