Como usar a API de soquete C em C ++ no z / OS

votos
126

Eu tenho tido problemas obtendo o C soquetes API para funcionar corretamente no C ++. Especificamente, embora eu estou incluindo sys/socket.h, eu ainda obter erros de compilação tempo me dizendo que AF_INETnão está definido. Estou faltando alguma coisa óbvia, ou isso poderia estar relacionado ao fato de que eu estou fazendo isso codificação em z/OSe meus problemas são muito mais complicadas?


Atualização : Ao investigar mais, descobri que há uma #ifdefque eu estou batendo. Aparentemente, z/OSnão é feliz a menos que eu definir qual tipo de soquetes que estou usando com:

#define _OE_SOCKETS

Agora, eu pessoalmente não tenho idéia do que isso _OE_SOCKETSé realmente para, então, se nenhum z/OSprogramadores soquetes estão lá fora (todos os 3 de você), talvez você poderia me dar um resumo de como tudo isso funciona?


Claro que eu posso postar um aplicativo de teste.

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Compilar / link de saída:

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

./inet.C, linha 5.16: CCN5274 (S) A pesquisa de nome para AF_INET não encontrou uma declaração.

CCN0797 (I) Compilação falhou por ./inet.C arquivo. arquivo objeto não foi criado.

Uma verificação de sys / sockets.h não inclui a definição que eu preciso, e, tanto quanto eu posso dizer, não está sendo bloqueado por quaisquer declarações #ifdef.

Tenho no entanto notado que contém um do seguinte:

#ifdef __cplusplus
  extern C {
#endif

que encapsula basicamente o arquivo inteiro. Não tenho certeza se isso importa.

Publicado 01/08/2008 em 13:13
fonte usuário
Em outras línguas...                            


9 respostas

votos
71

Mantenha uma cópia dos manuais IBM úteis:

As publicações da IBM são geralmente muito bom, mas você precisa se acostumar com seu formato, bem como saber onde procurar por uma resposta. Você vai encontrar muitas vezes que um recurso que você deseja usar é guardado por um "macro teste de recurso"

Você deve perguntar o programador do sistema amigável para instalar o XL C / C ++ Run-Time Library Reference: Páginas Man em seu sistema. Em seguida, você pode fazer coisas como "o homem ligar" para puxar para cima a página man para o soquete connect () API. Quando faço isso, isso é o que eu vejo:

FORMATO

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);
Respondeu 18/09/2009 em 12:17
fonte usuário

votos
34

Eu tive nenhum problema usando o API BSD sockets em C ++, em GNU / Linux. Aqui está o programa de exemplo que eu usei:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Assim, a minha opinião sobre isso é que z / OS é provavelmente o fator complicador aqui, no entanto, porque eu nunca usei z / OS antes, muito menos programado nele, eu não posso dizer isso definitivamente. :-P

Respondeu 01/08/2008 em 13:22
fonte usuário

votos
29

Veja o Usando z / OS UNIX System Services soquetes no Guia do z / OS XL C / C ++ programação. Certifique-se de que você está incluindo os arquivos de cabeçalho necessários e usando os #defines apropriadas.

O link para o doc mudou ao longo dos anos, mas você deve ser capaz de chegar a ele com bastante facilidade por encontrar o local atual do seção de Suporte e Transferências em ibm.com e procurar a documentação por título.

Respondeu 15/05/2009 em 06:27
fonte usuário

votos
23

O _OE_SOCKETS parece ser simplesmente para activar / desactivar a definição de símbolos relacionados com o soquete. Não é incomum em algumas bibliotecas para ter um monte de macros para fazer isso, para garantir que você não está compilando / ligando partes não necessárias. A macro não é padrão em outras implementações de sockets, parece ser algo específico para z / OS.

Dê uma olhada nesta página:
Compilar e ligar az / VM Programa Sockets C

Respondeu 11/10/2008 em 01:38
fonte usuário

votos
23

Então tente

#define _OE_SOCKETS

antes de incluir sys / socket.h

Respondeu 21/09/2008 em 13:37
fonte usuário

votos
17

Você pode querer dar uma olhada para CPP-soquetes , um C ++ wrapper para as chamadas de sistema soquetes. Ele funciona com vários sistemas operacionais (Win32, POSIX, Linux, * BSD). Eu não acho que ele vai trabalhar com z / OS, mas você pode dar uma olhada no incluem arquivos que ele usa e você terá muitos exemplos de código testado que funciona bem em outros SOs.

Respondeu 07/09/2008 em 09:21
fonte usuário

votos
15

@Jax: Os extern "C"assuntos coisa, muito muito. Se um arquivo de cabeçalho não tem um, então (a menos que seja um C ++ - único arquivo cabeçalho), você teria que incluir seu #includecom ele:

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

Basicamente, a qualquer hora, onde um programa C ++ quer conectar-se a instalações baseadas em C, o extern "C"é vital. Em termos práticos, isso significa que os nomes usados em referências externas não será mutilado, como nomes normais C ++ faria. Referência.

Respondeu 01/08/2008 em 14:40
fonte usuário

votos
11

A resposta é usar o sinalizador c89 que se segue:

 -D_OE_SOCKETS

Exemplo seguinte;

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

Para mais informações procure opções C89 no Guia do Usuário do z / OS XLC / C ++.

Respondeu 11/04/2011 em 19:59
fonte usuário

votos
11

AVISO: Eu não sou programador C ++, no entanto eu sei C muito bem. I adapated estas chamadas de algum código C que tenho.

Também remarcação colocar estes estranha _ como meus sublinhados.

Você deve apenas ser capaz de escrever uma classe de abstração em torno dos soquetes C com algo como isto:

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

Então, métodos para a abertura, fechamento e envio de pacotes para baixo do soquete.

Por exemplo, a chamada aberta poderia ser algo como isto:

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;
}
Respondeu 29/08/2008 em 19:56
fonte usuário

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