Estou tendo problemas recebendo o soquetes C API para funcionar corretamente no C++
on z/OS
.
Embora eu esteja incluindo sys/socket.h
, ainda recebo erros de tempo de compilação informando que isso AF_INET
não está definido .
Estou perdendo algo óbvio, ou isso está relacionado ao fato de estar ligado z/OS
torna meus problemas muito mais complicados?
Atualização : Após uma investigação mais aprofundada, descobri que há um #ifdef
que estou atingindo. Aparentemente, z/OS
não é feliz, a menos que eu defina com qual "tipo" de soquetes estou usando:
#define _OE_SOCKETS
Agora, pessoalmente, eu não tenho ideia do que _OE_SOCKETS
é isso, de modo que, se houver algum z/OS
programador de soquetes (todos vocês três), talvez você possa me dar um resumo de como tudo isso funciona?
Test App
#include <sys/socket.h>
int main()
{
return AF_INET;
}
Saída de compilação / link:
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.
Uma verificação de sys / sockets.h inclui a definição de que preciso e, tanto quanto posso dizer, ela não está sendo bloqueada por nenhuma #ifdef
instrução.
No entanto, notei que ele contém o seguinte:
#ifdef __cplusplus
extern "C" {
#endif
que encapsula basicamente o arquivo inteiro? Não tenho certeza se isso importa.
Então tente
antes de incluir sys / socket.h
fonte
Você pode dar uma olhada em cpp-sockets , um wrapper C ++ para as chamadas do sistema de soquetes. Funciona com muitos sistemas operacionais (Win32, POSIX, Linux, * BSD). Não acho que funcione com o z / OS, mas você pode dar uma olhada nos arquivos de inclusão que ele usa e terá muitos exemplos de código testado que funcionam bem em outros sistemas operacionais.
fonte
@Jax: A
extern "C"
coisa importa, muito, muito. Se um arquivo de cabeçalho não tiver um, então (a menos que seja um arquivo de cabeçalho somente em C ++), você deverá anexá#include
-lo a ele:Basicamente, sempre que um programa C ++ deseja se vincular a instalações baseadas em C, isso
extern "C"
é vital. Em termos práticos, isso significa que os nomes usados nas referências externas não serão mutilados, como nomes C ++ normais. Referência.fonte
AVISO LEGAL: Eu não sou um programador de C ++, no entanto, eu sei C muito bem. Eu adaptei essas chamadas de algum código C que eu tenho.
Também o markdown coloca esses _ estranhos como meus sublinhados.
Você deve conseguir escrever uma classe de abstração em torno dos soquetes C com algo como isto:
Em seguida, tenha métodos para abrir, fechar e enviar pacotes pelo soquete.
Por exemplo, a chamada aberta pode ser algo como isto:
fonte
Use o seguinte sinalizador c89:
Exemplo:
Para obter mais informações, procure as Opções do c89 no Guia do Usuário do z / OS XLC / C ++.
fonte