c++ - tutorial - install hbase ubuntu




Comment utiliser l'API de socket C en C++ sur z/OS (6)

J'ai des problèmes à faire fonctionner correctement l'API sockets C en C ++ sous z/OS .

Bien que AF_INET sys/socket.h , des erreurs de temps de compilation me AF_INET que AF_INET n'est pas défini.

Est-ce qu'il me manque quelque chose d'évident ou est-ce lié au fait qu'être sous z/OS complique beaucoup mes problèmes?

Mise à jour : Après une enquête plus approfondie, j'ai découvert qu'il y a un #ifdef que je frappe. Apparemment, z/OS n'est satisfait que si je définis le "type" de sockets que j'utilise avec:

#define _OE_SOCKETS

_OE_SOCKETS , je ne sais _OE_SOCKETS pas à quoi _OE_SOCKETS ce _OE_SOCKETS . Par conséquent, si des programmeurs de sockets z/OS sont présents (tous les trois), vous pourriez peut-être me donner un aperçu de la manière dont tout cela fonctionne?

Test App

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Compiler / Lien de sortie:

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.

Une vérification de sys / sockets.h inclut la définition dont j'ai besoin et, autant que je sache, elle n'est pas bloquée par des instructions #ifdef.

J'ai cependant remarqué qu'il contient les éléments suivants:

#ifdef __cplusplus
  extern "C" {
#endif

qui encapsule essentiellement le fichier entier. Pas sûr que ça compte.


@ Jax: L' extern "C" est très important. Si un fichier d’en-tête n’en a pas, alors (sauf s’il s’agit d’un fichier d’en-tête uniquement en C ++), vous devrez y inclure votre #include :

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

Fondamentalement, chaque fois qu'un programme C ++ souhaite établir une liaison avec des installations basées sur C, l' extern "C" est essentiel. Concrètement, cela signifie que les noms utilisés dans les références externes ne seront pas mutilés, contrairement aux noms C ++ normaux. Reference.


AVERTISSEMENT: Je ne suis pas un programmeur C ++, cependant je connais très bien le C. J'ai adapté ces appels à partir d'un code C que j'ai.

Markdown a également mis ces étranges _ comme soulignés.

Vous devriez juste être capable d'écrire une classe d'abstraction autour des sockets C avec quelque chose comme ça:

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

Puis avoir des méthodes pour ouvrir, fermer et envoyer des paquets dans le socket.

Par exemple, l'appel ouvert pourrait ressembler à ceci:

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

Conservez une copie des manuels IBM à portée de main:

Les publications IBM sont généralement très bonnes, mais vous devez vous habituer à leur format et savoir où chercher une réponse. Vous constaterez assez souvent qu'une fonctionnalité que vous souhaitez utiliser est protégée par une "macro de test de fonctionnalité".

Vous devriez demander à votre programmeur système convivial d'installer la référence de bibliothèque de bibliothèque au moment de l' exécution XL C / C ++: Pages de manuel sur votre système. Ensuite, vous pouvez faire des choses comme "man connect" pour afficher la page de manuel de l’API socket connect (). Quand je fais ça, voici ce que je vois:

FORMAT

X / Ouvert

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

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

Douilles Berkeley

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

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

Consultez la section Utilisation des sockets z / OS UNIX System Services dans le Guide de programmation z / OS XL C / C ++. Assurez-vous d'inclure les fichiers d'en-tête nécessaires et d'utiliser les #defines appropriées.

Le lien vers la documentation a changé au fil des ans, mais vous devriez pouvoir y accéder assez facilement en recherchant l'emplacement actuel de la section Support et téléchargements sur ibm.com et en recherchant la documentation par titre.


Je n'ai eu aucun problème à utiliser l'API de sockets BSD en C ++, sous GNU / Linux. Voici l'exemple de programme que j'ai utilisé:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Donc, mon point de vue est que z / OS est probablement le facteur de complication ici, cependant, parce que je n'ai jamais utilisé z / OS auparavant, encore moins programmé dans celui-ci, je ne peux pas le dire de manière définitive. :-P


La réponse est d'utiliser le drapeau c89 qui suit:

 -D_OE_SOCKETS

L'exemple suit;

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

Pour plus d'informations, recherchez Options C89 dans le Guide de l'utilisateur z / OS XLC / C ++.





zos