Jak používat C socket API v jazyce C ++ v systému z / OS

hlasů
126

Byl jsem s problémy při získávání C zásuvky API správně pracovat v jazyce C ++. Konkrétně, i když jsem je sys/socket.h, já ještě dostat kompilaci chyby, říkal mi, že AF_INETnení definována. Mám něco chybí zřejmý, nebo by to mohlo souviset s tím, že to dělám kódování na z/OSa moje problémy jsou mnohem složitější?


Aktualizace : Při dalším šetření, jsem zjistil, že tam je #ifdef, že jsem bít. Zřejmě z/OSnení rád, pokud jsem definovat, které „type“ zásuvek Já používám na:

#define _OE_SOCKETS

Teď, já osobně nemám ponětí, co to _OE_SOCKETSje vlastně za, takže pokud nějaké z/OSjsou venku (všechny 3 z vás) zásuvky programátoři, možná byste mohl mi dát náměty jak se to všechno funguje?


Jistý, že může psát testovací aplikace.

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Kompilaci / Link Výstup:

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

„./inet.C“, linka 5,16: CCN5274 (S) Vyhledávací název ‚AF_INET‘ nenašel prohlášení.

CCN0797 (I) Kompilace se nezdařila pro soubor ./inet.C. Soubor objekt není vytvořen.

Kontrolu sys / sockets.h sice obsahuje definici, co potřebuji a co mohu říci, že není blokován žádnými #ifdef prohlášení.

Nicméně jsem si všiml, že obsahuje následující kroky:

#ifdef __cplusplus
  extern C {
#endif

který zapouzdřuje v podstatě celý soubor. Není si jistý, jestli je to důležité.

Položena 01/08/2008 v 13:13
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
71

Uchovávat kopii příručky IBM příručních:

Publikace IBM jsou obecně velmi dobré, ale je třeba si zvyknout na jejich formátu, stejně jako vědět, kde hledat odpověď. Zjistíte poměrně často, že funkce, které chcete použít, je střežen „zahrnuje testovací makro“

Měli byste se zeptat svého přátelské systémový programátor pro instalaci XL C / C ++ Runtime Library Reference: manuálové stránky na vašem systému. Pak můžete dělat věci jako „muže připojit“ vytáhnout v manuálové stránce zásuvky connect () API. Když jsem to udělal, to je to, co vidím:

FORMÁT

X / otevřít

#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);
Odpovězeno 18/09/2009 v 12:17
zdroj uživatelem

hlasů
34

Měl jsem žádné problémy s využitím BSD sockets API v jazyce C ++, v GNU / Linux. Zde je ukázkový program jsem použil:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Takže můj názor na to, že z / OS je asi komplikujícím faktorem zde, nicméně, protože jsem nikdy nepoužíval z / OS dříve, mnohem méně naprogramované v něm nemohu říci definitivně. :-P

Odpovězeno 01/08/2008 v 13:22
zdroj uživatelem

hlasů
29

Viz Použití z / OS UNIX System Services zásuvek sekci v adresáři / OS XL C / C ++ Programming Guide z. Ujistěte se, že je potřebné hlavičkové soubory a za použití vhodných #DEFINEs.

Odkaz na doc změnilo v průběhu let, ale měli byste být schopni dostat se do toho dost snadno zjistit aktuální umístění části Podpora a materiály ke stažení na ibm.com a vyhledávání v dokumentaci podle názvu.

Odpovězeno 15/05/2009 v 06:27
zdroj uživatelem

hlasů
23

_OE_SOCKETS se zdá být jednoduše aktivovat / deaktivovat definici symbolů zásuvek souvisejících. Není neobvyklé, že v některých knihovnách mají spoustu maker k tomu, že, aby se zajistilo, že nejste sestavování / spojovací díly nejsou potřebné. Makro není standardem v jiných implementacích zásuvky, se zdá být něco specifické pro z / OS.

Podívejte se na této stránce:
Kompilace a propojení z / VM C Zásuvky Program

Odpovězeno 11/10/2008 v 01:38
zdroj uživatelem

hlasů
23

tak zkuste

#define _OE_SOCKETS

Před zahrnout sys / socket.h

Odpovězeno 21/09/2008 v 13:37
zdroj uživatelem

hlasů
17

Možná budete chtít, aby se podívali na CPP-zásuvek , C ++ wrapper pro zásuvky systémová volání. Pracuje s mnoha operačními systémy (Win32, POSIX, Linux, * BSD). Nemyslím si, že to bude fungovat s z / OS, ale můžete se podívat na include soubory používá a budete mít mnoho příkladů testovaného kódu, který funguje dobře na jiných operačních systémech.

Odpovězeno 07/09/2008 v 09:21
zdroj uživatelem

hlasů
15

@Jax: The extern "C"věc záležitosti, velice mnoho. Je-li hlavičkový soubor žádnou nemá, pak (pokud se jedná o C ++ - pouze hlavičky souboru), budete muset přiložit #includes ní:

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

V podstatě kdykoliv, kdy program v jazyce C ++ chce propojit zařízení C-založen, extern "C"je velmi důležité. Z praktického hlediska to znamená, že názvy používané ve vnějších odkazech nebudou pozměněny, jako normální C ++ jmen ano. Odkaz.

Odpovězeno 01/08/2008 v 14:40
zdroj uživatelem

hlasů
11

Odpověď je použít C89 příznak, který následuje:

 -D_OE_SOCKETS

Příklad následuje;

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

Další informace hledat možnosti C89 v systému z / OS xlC / C ++ uživatelské příručce.

Odpovězeno 11/04/2011 v 19:59
zdroj uživatelem

hlasů
11

OMEZENÍ: Nejsem C ++ programátor, ale vím, C opravdu dobře. upraveny tak jsem tyto hovory z nějakého C kód mám.

Také markdown dát tyto podivné _ jako moje podtržítka.

Ty by měly pouze být schopni napsat třídu abstrakce kolem zásuvek C se něco takového:

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

Pak metody pro otevírání, zavírání a posílání paketů se zásuvky.

Například Otevřená výzva může vypadat nějak takto:

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;
}
Odpovězeno 29/08/2008 v 19:56
zdroj uživatelem

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