Comment utiliser l'API de prise de C en C ++ sous z / OS

voix
126

J'ai eu des problèmes à obtenir l'API sockets C fonctionne correctement en C ++. Plus précisément, bien que je suis notamment sys/socket.h, je reçois encore des erreurs de compilation de temps me disant que AF_INETn'est pas défini. Suis - je manque quelque chose d' évident, ou pourrait - il être lié au fait que je fais ce codage sur z/OSet mes problèmes sont beaucoup plus complexes?


Mise à jour : Après enquête, je découvre qu'il y a un #ifdefque je frappe. Apparemment , z/OSest pas heureux à moins que je définis qui « type » de prises que je utilise avec:

#define _OE_SOCKETS

Maintenant, j'ai personnellement aucune idée de ce que cela _OE_SOCKETSest en fait pour, si les z/OSprogrammeurs sont prises là - bas (tous les 3 d' entre vous), vous pourriez peut - être me donner un aperçu de la façon dont tout cela fonctionne?


Bien sûr, je peux poster une application de test.

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Sortie de compilation / lien:

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

« ./inet.C », ligne 5.16: CCN5274 (S) Le nom recherche pour « AF_INET » n'a pas trouvé une déclaration.

CCN0797 (I) Compilation a échoué pour le fichier ./inet.C. fichier d'objet non créé.

Une vérification des sys / sockets.h inclut la définition que j'ai besoin, et pour autant que je peux dire, il n'est pas bloquée par des déclarations #ifdef.

Je l'ai cependant remarqué qu'il contient un ce qui suit:

#ifdef __cplusplus
  extern C {
#endif

qui encapsule essentiellement le fichier entier. Je ne sais pas si cela importe.

Créé 01/08/2008 à 13:13
source utilisateur
Dans d'autres langues...                            


9 réponses

voix
71

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

Les publications d'IBM sont généralement très bons, mais vous devez vous habituer à leur format, ainsi que de savoir où chercher une réponse. Vous trouverez bien souvent qu'une caractéristique que vous souhaitez utiliser est gardée par un « macro de test de fonctionnalité »

Vous devriez demander à votre programmeur système convivial pour installer le XL C / C ++ Run-Time Reference Library: Man pages sur votre système. Ensuite , vous pouvez faire des choses comme « l' homme se connecter » à tirer vers le haut la page de manuel pour l'API socket connect (). Quand je fais cela, ce que je vois:

FORMAT

X / Open

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

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

Prises Berkeley

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

int connect(int socket, struct sockaddr *address, int address_len);
Créé 18/09/2009 à 12:17
source utilisateur

voix
34

J'ai eu aucun problème en utilisant les prises BSD API en C ++, sous GNU / Linux. Voici l'exemple de programme je:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Donc, mon avis sur ce que z / OS est probablement le facteur qui complique ici, cependant, parce que je ne l'ai jamais utilisé z / OS avant, beaucoup moins programmé, je ne peux pas dire cela définitivement. :-P

Créé 01/08/2008 à 13:22
source utilisateur

voix
29

Voir l' utilisation de z / OS services système UNIX sockets section dans le z / OS XL C / C ++ Guide de programmation. Assurez - vous que vous incluez les fichiers d' en- tête nécessaires et en utilisant les #defines appropriés.

Le lien vers le document a changé au fil des ans, mais vous devriez être en mesure d'obtenir assez facilement en trouver l'emplacement actuel de la section Support et téléchargements sur ibm.com et la recherche de la documentation par titre.

Créé 15/05/2009 à 06:27
source utilisateur

voix
23

Le _OE_SOCKETS semble être simplement pour activer / désactiver la définition des symboles liés socket. Il n'est pas rare dans certaines bibliothèques ont un tas de macros pour le faire, pour assurer que vous n'êtes pas la compilation / liant les parties ne sont pas nécessaires. La macro n'est pas standard dans d'autres prises de courant mises en œuvre, il semble être quelque chose de spécifique à z / OS.

Jetez un oeil à cette page:
Compiler et lier z / VM C Programme Sockets

Créé 11/10/2008 à 01:38
source utilisateur

voix
23

Donc, essayez

#define _OE_SOCKETS

avant d'inclure sys / socket.h

Créé 21/09/2008 à 13:37
source utilisateur

voix
17

Vous pouvez jeter un oeil à cpp-prises , un C ++ wrapper pour les appels système sockets. Il travaille avec de nombreux systèmes d'exploitation (Win32, POSIX, Linux, * BSD). Je ne pense pas que cela fonctionnera avec z / OS , mais vous pouvez jeter un oeil à l'inclure des fichiers qu'il utilise et vous aurez de nombreux exemples de code testé qui fonctionne bien sur d' autres systèmes d' exploitation.

Créé 07/09/2008 à 09:21
source utilisateur

voix
15

@Jax: Les extern "C"questions de chose, très beaucoup. Si un fichier d' en- tête n'a pas, alors ( à moins que c'est un C ++ - uniquement le fichier d' en- tête), vous devrez joindre votre #includeavec elle:

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

En fait, à tout moment où un programme C ++ veut créer un lien vers des installations à base de C, l' extern "C"est vitale. En pratique, cela signifie que les noms utilisés dans les références externes ne seront pas mutilée, comme normaux noms C ++ serait. Référence.

Créé 01/08/2008 à 14:40
source utilisateur

voix
11

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

 -D_OE_SOCKETS

Exemple suit;

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

Pour plus d'informations chercher C89 options dans le Guide du z / OS XLC / C de l'utilisateur.

Créé 11/04/2011 à 19:59
source utilisateur

voix
11

DISCLAIMER: Je ne suis pas un programmeur C ++, mais je sais très bien C. J'adapated ces appels de code C je.

En outre Markdown mettre ces étranges _ que mes underscores.

Vous devez simplement être en mesure d'écrire une classe d'abstraction autour des prises C avec quelque chose comme ceci:

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

Ensuite, avoir des méthodes pour l'ouverture, la fermeture et l'envoi de paquets sur la prise.

Par exemple, pourrait ressembler à l'appel ouvert 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;
}
Créé 29/08/2008 à 19:56
source utilisateur

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