Hogyan kell használni a C socket API C ++ z / OS

szavazat
126

Már gondjai egyre C aljzatok API megfelelő működését a C ++. Pontosabban, bár Én többek között sys/socket.h, én még mindig fordításkor hibákat mondani, hogy AF_INETnincs definiálva. Én hiányzó valami nyilvánvaló, vagy lehet ezt azzal a ténnyel, hogy csinálok ezt a kódolást z/OSés a problémák sokkal bonyolultabb?


Frissítés : A további vizsgálat során rájöttem, hogy van egy #ifdef, hogy én vagyok üti. Úgy látszik, z/OSnem boldog, ha nem határozza meg, mely a „típus” foglalatok én használ az:

#define _OE_SOCKETS

Nos, én személy szerint fogalmam sincs, mi ez _OE_SOCKETSvalójában az, így ha bármilyen z/OSaljzatok programozók odakinn (mind a 3 van), talán meg tudná adni nekem egy lepusztult, hogy ez hogyan működik a rendszer?


Persze, hogy küldhet tesztalkalmazást.

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Fordítsd / Link kimenet:

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

„./inet.C” vonal 5,16: CCN5274 (S) A név feloldást »AF_INET« nem talál egy nyilatkozatot.

CCN0797 (I) Összeállítás meghiúsult fájl ./inet.C. Objektum fájl nem jött létre.

Meg kell vizsgálni sys / sockets.h nem tartalmazza a meghatározás azt kell, és amennyire én tudom, hogy nem blokkolja bármely #ifdef nyilatkozatokat.

Én azonban észre tartalmazza a következőket:

#ifdef __cplusplus
  extern C {
#endif

amely magában gyakorlatilag az egész fájlt. Nem biztos, hogy ez számít.

A kérdést 01/08/2008 13:13
a forrás felhasználó
Más nyelveken...                            


9 válasz

szavazat
34

Már nem volt baj a BSD socket API C ++, a GNU / Linux. Itt a mintaprogram szoktam:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Tehát én veszi az, hogy z / OS valószínűleg a nehezítő tényező van azonban, mert én soha nem használtam z / OS előtt, sokkal kevésbé programozott, azt nem lehet mondani, ez véglegesen. :-P

Válaszolt 01/08/2008 13:22
a forrás felhasználó

szavazat
15

@Jax: A extern "C"dolog számít, nagyon nagyon. Ha a header fájl nem rendelkezik ilyennel, akkor (hacsak nem egy C ++ - csak header file), akkor kellett volna csatolni a #includevele:

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

Alapvetően, bármikor, amikor egy C ++ program kér hivatkozó C-alapú szolgáltatások, a extern "C"létfontosságú. Gyakorlati szempontból ez azt jelenti, hogy a használt nevek külső hivatkozásokat nem lesz szétroncsolt, mint a normál C ++ neveket. Referencia.

Válaszolt 01/08/2008 14:40
a forrás felhasználó

szavazat
11

NYILATKOZAT: nem vagyok egy C ++ programozó, de tudom, hogy a C igazán jól. Azt adapated ezek a hívások néhány C kód van.

Szintén árleszállítás hogy ezeket a furcsa _, mint az én aláhúzás.

Meg kell csak képes, hogy írjon egy absztrakció osztály bárhol C aljzatok, valahogy így:

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

Akkor módszerek, zárás, és csomagokat küld le az elektromos csatlakozót.

Például a nyílt felhívás lehet kinézni:

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;
}
Válaszolt 29/08/2008 19:56
a forrás felhasználó

szavazat
17

Érdemes lehet, hogy egy pillantást, hogy a CPP-foglalat , egy C ++ wrapper hüvelyek rendszer hívásokat. Úgy működik, számos operációs rendszer (Win32, POSIX, Linux, * BSD). Nem hiszem, hogy együtt fog működni z / OS, de akkor megnézzük az include fájlokat használ, és akkor sok példát vizsgált kód, amely jól működik más operációs.

Válaszolt 07/09/2008 09:21
a forrás felhasználó

szavazat
23

Így próbálja

#define _OE_SOCKETS

Mielőtt közé sys / socket.h

Válaszolt 21/09/2008 13:37
a forrás felhasználó

szavazat
23

A _OE_SOCKETS tűnik egyszerűen ki / bekapcsolására meghatározása foglalatokkal kapcsolatos szimbólumokat. Nem ritka, hogy az egyes könyvtárak, hogy van egy csomó makrók csinálni, hogy biztosítsa, hogy te nem összeállítása / összekötő részek nem szükséges. A makró nem szabványos egyéb foglalat megvalósítások, úgy tűnik, hogy valami különleges, hogy z / OS.

Vessen egy pillantást erre az oldalra:
lefordításához és z / VM C Sockets Program

Válaszolt 11/10/2008 01:38
a forrás felhasználó

szavazat
29

Lásd a z / OS UNIX System Services aljzatok szakaszt a z / OS XL C / C ++ programozási útmutató. Győződjön meg róla, beleértve a szükséges header fájlokat és a megfelelő #define.

A kapcsolat a doc változott az évek során, de képesnek kell lennie arra, hogy neki elég könnyen, találd meg a jelenlegi helyét a Támogatás és letöltések részén a ibm.com és keresi a dokumentációban címet.

Válaszolt 15/05/2009 06:27
a forrás felhasználó

szavazat
71

Tartson egy másolatot az IBM kézikönyvek praktikus:

Az IBM kiadványok általában nagyon jó, de meg kell szokni, hogy a méret, valamint tudják, hol kell keresni a választ. Megtalálja elég gyakran, hogy a funkció, amely a használni kívánt őrzött egy „funkció vizsgálat makro”

Meg kell kérni a baráti rendszerprogramozó telepíteni a XL C / C ++ Run-Time Library Reference: Man oldalak a rendszerben. Akkor meg tudod csinálni a dolgokat, mint „ember csatlakozni”, hogy húzza fel a man oldalt a foglalat connect () API-t. Ha sikerül, ez az, amit látok:

FORMÁTUM

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);
Válaszolt 18/09/2009 12:17
a forrás felhasználó

szavazat
11

A válasz használja a C89 zászló, amely a következő:

 -D_OE_SOCKETS

Példa következik;

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

További információt keresni C89 opciók a z / OS XLC / C ++ használati útmutató.

Válaszolt 11/04/2011 19:59
a forrás felhasználó

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