Hvordan bruke C socket API i C ++ på z / OS

stemmer
132

Jeg har problemer med å få C stikkontakter API for å fungere i C ++ på z/OS.

Selv om jeg er inkludert sys/socket.h, jeg fortsatt få kompilere time feil å fortelle meg at AF_INETdet ikke er definert.

Jeg mangler noe opplagt, eller er dette relatert til det faktum at å være på z/OSgjør mine problemer mye mer komplisert?


Oppdatering : Ved nærmere etterforskning, oppdaget jeg at det er en #ifdefsom jeg treffer. Tilsynelatende z/OSer ikke fornøyd med mindre jeg definerer som type av stikkontakter jeg bruker med:

#define _OE_SOCKETS

Nå, jeg personlig har ingen anelse om hva dette _OE_SOCKETSfaktisk er for, så hvis noen z/OSstikkontakter programmerere er der ute (alle 3 av dere), kanskje du kunne gi meg en oversikt over hvordan dette fungerer?


test App

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Kompilere / Link Output:

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.

En sjekk av sys / sockets.h ikke inkluderer definisjonen jeg trenger, og så vidt jeg kan fortelle, er at det ikke blir blokkert av noen # ifdef uttalelser.

Jeg har imidlertid lagt merke til den inneholder følgende:

#ifdef __cplusplus
  extern C {
#endif

som omslutter utgangspunktet hele filen. Ikke sikker på om det betyr noe.

Publisert på 01/08/2008 klokken 12:13
kilden bruker
På andre språk...                            


9 svar

stemmer
75

Behold en kopi av IBM manualer hendige:

IBM publikasjoner er generelt veldig bra, men du må bli vant til sitt format, samt vite hvor du skal lete etter et svar. Du vil finne ganske ofte at en funksjon som du vil bruke, er voktet av en "funksjon test makro"

Du bør spørre din vennlige system programmerer for å installere XL C / C ++ Run-Time bibliotek Annonse: Man Sider på systemet. Deretter kan du gjøre ting som "man koble til" å trekke opp mannen siden for kontakten koble () API. Når jeg gjør det, dette er hva jeg ser:

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);
Svarte 18/09/2009 kl. 11:17
kilden bruker

stemmer
37

Jeg har hatt noen problemer med å bruke BSD stikkontakter API i C ++, i GNU / Linux. Her er prøven programmet jeg brukte:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Så min ta på dette er at z / OS er trolig den kompliserende faktor her, men fordi jeg aldri har brukt z / OS før, langt mindre programmert i det, jeg kan ikke si dette definitivt. :-P

Svarte 01/08/2008 kl. 12:22
kilden bruker

stemmer
31

Se Bruke z / OS UNIX System Services stikkontakter seksjonen i z / OS XL C / C ++ Programming Guide. Pass på at du inkluderer de nødvendige header filer og bruke de riktige #defines.

Linken til doc har endret seg gjennom årene, men du bør være i stand til å få til det enkelt nok ved å finne den nåværende plasseringen av Support og nedlastinger delenibm.com og søke på dokumentasjon av tittelen.

Svarte 15/05/2009 kl. 05:27
kilden bruker

stemmer
25

Den _OE_SOCKETS synes å være ganske enkelt å aktivere / deaktivere definisjonen av sokkelrelaterte symboler. Det er ikke uvanlig i enkelte bibliotekene å ha en haug med makroer for å gjøre det, for å sikre at du ikke kompilering / linking deler ikke nødvendig. Makro er ikke standard i andre stikkontakter implementeringer, synes det å være noe spesielt for z / OS.

Ta en titt på denne siden:
Kompilering og Linking az / VM C Sockets Program

Svarte 11/10/2008 kl. 00:38
kilden bruker

stemmer
25

så prøv

#define _OE_SOCKETS

før du inkluderer sys / socket.h

Svarte 21/09/2008 kl. 12:37
kilden bruker

stemmer
19

Det kan være lurt å ta en titt for å CPP-stikkontakter , en C ++ wrapper for kontaktene systemkall. Det fungerer med mange operativsystemer (Win32, POSIX, Linux, * BSD). Jeg tror ikke det vil fungere med z / OS, men du kan ta en titt på den inkluderer filer den bruker og du har mange eksempler på testet kode som fungerer godt på andre operativsystemer.

Svarte 07/09/2008 kl. 08:21
kilden bruker

stemmer
18

@Jax: De extern "C"ting som teller, veldig veldig mye. Hvis en header fil ikke har en, og deretter (med mindre det er en C ++ - bare header fil), ville du må legge inn #includemed det:

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

I utgangspunktet, når som helst hvor et C ++ program ønsker å knytte til C-baserte anlegg, extern "C"er avgjørende. I praksis betyr det at navnene brukes i eksterne referanser vil ikke bli lemlestede, som vanlig C ++ navn ville. Henvisning.

Svarte 01/08/2008 kl. 13:40
kilden bruker

stemmer
13

Svaret er å bruke c89 flagg som følger:

 -D_OE_SOCKETS

Eksempel følger;

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

For mer informasjon se for C89 alternativer i z / OS XLC / C ++ brukerhåndboken.

Svarte 11/04/2011 kl. 18:59
kilden bruker

stemmer
13

DISCLAIMER: Jeg er ikke en C ++ programmerer, men jeg vet C veldig bra. Jeg adapated disse samtalene fra noen C-kode jeg har.

Også markdown sette disse merkelige _ som mine strek.

Du skal bare være i stand til å skrive en abstraksjon klassen rundt C stikkontakter med noe sånt som dette:

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

Da har metoder for åpning, lukking og sending av pakker ned i sokkelen.

For eksempel kan den åpne samtalen se omtrent slik ut:

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;
}
Svarte 29/08/2008 kl. 18:56
kilden bruker

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