Je vais avoir des problèmes à obtenir l'API C fonctionne correctement dans C++
le z/OS
.
Bien que j'inclus sys/socket.h
, j'obtiens toujours des erreurs de compilation me disant que ce AF_INET
n'est pas défini .
Est-ce que je rate quelque chose d'évident ou est-ce lié au fait qu'être en marche z/OS
rend mes problèmes beaucoup plus compliqués?
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
je ne suis pas heureux à moins que je définisse avec quel «type» de sockets j'utilise:
#define _OE_SOCKETS
Maintenant, je n'ai personnellement aucune idée de ce à quoi cela _OE_SOCKETS
sert réellement, donc s'il y a des z/OS
programmeurs de sockets (vous trois), vous pourriez peut-être me donner un aperçu de la façon dont tout cela fonctionne?
Tester l'application
#include <sys/socket.h>
int main()
{
return AF_INET;
}
Compiler / Lier la 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 pour autant que je sache, elle n'est bloquée par aucune #ifdef
déclaration.
J'ai cependant remarqué qu'il contient les éléments suivants:
#ifdef __cplusplus
extern "C" {
#endif
qui encapsule essentiellement le fichier entier? Je ne sais pas si cela compte.
Alors essayez
avant d'inclure sys / socket.h
la source
Vous voudrez peut-être jeter un œil à cpp-sockets , un wrapper C ++ pour les appels système des sockets. Il fonctionne 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 œil aux fichiers d'inclusion qu'il utilise et vous aurez de nombreux exemples de code testé qui fonctionne bien sur d'autres systèmes d'exploitation.
la source
@Jax: Le
extern "C"
truc est très important. Si un fichier d'en-tête n'en a pas, alors (à moins qu'il ne s'agisse d'un fichier d'en-tête uniquement C ++), vous devrez le joindre#include
:Fondamentalement, chaque fois qu'un programme C ++ souhaite se lier à des installations basées sur C, il
extern "C"
est vital. En termes pratiques, cela signifie que les noms utilisés dans les références externes ne seront pas mutilés, comme le feraient les noms C ++ normaux. Référence.la source
AVERTISSEMENT: Je ne suis pas un programmeur C ++, mais 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 soulignements.
Vous devriez simplement être capable d'écrire une classe d'abstraction autour des sockets C avec quelque chose comme ceci:
Ensuite, avez des méthodes pour ouvrir, fermer et envoyer des paquets dans le socket.
Par exemple, l'appel ouvert peut ressembler à ceci:
la source
Utilisez l'indicateur c89 suivant:
Exemple:
Pour plus d'informations, recherchez les options c89 dans le Guide de l'utilisateur z / OS XLC / C ++.
la source