DISABILITARE ADBLOCK

ADBlock sta bloccando alcuni contenuti del sito

ADBlock errore
risultati trovati: 

DOMANDA

Ho problemi a far funzionare correttamente l'API dei socket C in C ++ su z / OS .

Sebbene includa sys / socket.h , ricevo ancora errori di compilazione che mi dicono che AF_INET non è definito.

Mi sto perdendo qualcosa di ovvio o è legato al fatto che essere su z / OS rende i miei problemi molto più complicati?


Aggiorna : dopo ulteriori indagini, ho scoperto che c'è un #ifdef che sto colpendo. Apparentemente z / OS non è felice a meno che non definisca quale "tipo" di socket che sto usando con:

#define _OE_SOCKETS

Ora, personalmente non ho idea di cosa sia effettivamente questo _OE_SOCKETS , quindi se ci sono programmatori di socket z / OS là fuori (tutti e tre), forse potresti darmi una carrellata di come funziona tutto questo?


App di prova

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Output compilazione / collegamento:

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.

Un controllo di sys / sockets.h include la definizione di cui ho bisogno e, per quanto ne so, non viene bloccato da alcuna istruzione #ifdef.

Ho comunque notato che contiene quanto segue:

#ifdef __cplusplus
  extern "C" {
#endif

che incapsula sostanzialmente l'intero file. Non sono sicuro che sia importante.

SOLUZIONE

Tenere a portata di mano una copia dei manuali IBM:

Le pubblicazioni IBM sono generalmente molto buone, ma è necessario abituarsi al loro formato, oltre a sapere dove cercare una risposta. Scoprirai abbastanza spesso che una funzione che desideri utilizzare è protetta da una macro "test di funzionalità"

Dovresti chiedere al tuo programmatore di sistema amichevole di installare Riferimenti della libreria Run-Time XL C / C ++: pagine man sul tuo sistema. Quindi puoi fare cose come " man connect " per estrarre la pagina man per l'API socket connect (). Quando lo faccio, questo è quello che vedo:

Formato

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

Se ti va lasciaci una tua opinione

L'articolo ti è stato utile ed è tradotto correttamente?

ALTRI SUGGERIMENTI

Non ho avuto problemi ad usare l'API socket BSD in C ++, in GNU / Linux. Ecco il programma di esempio che ho usato:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Quindi la mia opinione su questo è che z / OS è probabilmente il fattore complicante qui, tuttavia, poiché non ho mai usato z / OS prima, tanto meno programmato in esso, non posso dirlo definitivamente. :-P

Vedere la sezione Uso dei socket dei servizi di sistema UNIX z / OS nella Guida alla programmazione c / C ++ z / OS XL. Assicurati di includere i file di intestazione necessari e di utilizzare le #define appropriate.

Il collegamento al documento è cambiato nel corso degli anni, ma dovresti riuscire a raggiungerlo abbastanza facilmente trovando la posizione corrente di Supporto e amp; Sezione download su ibm.com e ricerca della documentazione per titolo.

Quindi prova

#define _OE_SOCKETS

prima di includere sys / socket.h

Il _OE_SOCKETS sembra essere semplicemente per abilitare / disabilitare la definizione di simboli relativi al socket. In alcune librerie non è raro avere un sacco di macro per farlo, per assicurare che non si stiano compilando / collegando parti non necessarie. La macro non è standard nelle altre implementazioni di socket, sembra essere qualcosa di specifico per z / OS.

Dai un'occhiata a questa pagina:
Compilazione e collegamento del programma socket Z / VM C

Potresti dare un'occhiata a cpp-sockets , un wrapper C ++ per il chiamate di sistema socket. Funziona con molti sistemi operativi (Win32, POSIX, Linux, * BSD). Non credo che funzionerà con z / OS ma puoi dare un'occhiata ai file include che usa e avrai molti esempi di codice testato che funziona bene su altri sistemi operativi.

@Jax: la cosa extern " C " è molto importante. Se un file di intestazione non ne ha uno, allora (a meno che non sia un C ++ - solo file di intestazione), dovresti racchiudere il tuo #include con esso:

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

Fondamentalmente, ogni volta che un programma C ++ vuole collegarsi a strutture basate su C, extern & C; è vitale. In termini pratici, significa che i nomi utilizzati nei riferimenti esterni non verranno alterati, come farebbero i normali nomi C ++. Riferimento.

DISCLAIMER: non sono un programmatore C ++, tuttavia conosco C molto bene. io adattato queste chiamate da un codice C che ho.

Anche il markdown ha messo questi strani _ come punti di sottolineatura.

Dovresti essere in grado di scrivere una classe di astrazione attorno ai socket C con qualcosa del genere:

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

Quindi hanno metodi per aprire, chiudere e inviare pacchetti nel socket.

Ad esempio, la chiamata aperta potrebbe assomigliare a questa:

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

La risposta è usare il flag c89 che segue:

 -D_OE_SOCKETS

Segue l'esempio;

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

Per ulteriori informazioni, consultare Opzioni C89 nella Guida dell'utente di z / OS XLC / C ++.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow