Estoy teniendo problemas para conseguir la API de sockets C para que funcione correctamente en C++
el z/OS
.
Aunque lo estoy incluyendo sys/socket.h
, todavía recibo errores de tiempo de compilación que me dicen que AF_INET
no está definido .
¿Me estoy perdiendo algo obvio, o está relacionado con el hecho de que estar en él z/OS
complica mis problemas?
Actualización : Tras una investigación más profunda, descubrí que hay una #ifdef
que estoy golpeando. Aparentemente z/OS
no es feliz a menos que defina con qué "tipo" de sockets estoy usando:
#define _OE_SOCKETS
Ahora, personalmente no tengo idea de para qué _OE_SOCKETS
es esto , así que si hay algún z/OS
programador de sockets (los 3), ¿tal vez podrían darme un resumen de cómo funciona todo esto?
Aplicación de prueba
#include <sys/socket.h>
int main()
{
return AF_INET;
}
Compilar / Salida de enlace:
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.
Una comprobación de sys / sockets.h incluye la definición que necesito y, por lo que puedo decir, no está bloqueada por ninguna #ifdef
declaración.
Sin embargo, he notado que contiene lo siguiente:
#ifdef __cplusplus
extern "C" {
#endif
que encapsula básicamente todo el archivo? No estoy seguro si importa.
Así que intenta
antes de incluir sys / socket.h
fuente
Es posible que desee echar un vistazo a cpp-sockets , un contenedor de C ++ para las llamadas al sistema de sockets. Funciona con muchos sistemas operativos (Win32, POSIX, Linux, * BSD). No creo que funcione con z / OS, pero puede echar un vistazo a los archivos de inclusión que usa y tendrá muchos ejemplos de código probado que funciona bien en otros sistemas operativos.
fuente
@Jax: La
extern "C"
cosa importa, mucho, mucho. Si un archivo de encabezado no tiene uno, entonces (a menos que sea un archivo de encabezado solo C ++), deberá adjuntarlo#include
con él:Básicamente, en cualquier momento en que un programa C ++ quiera vincularse a instalaciones basadas en C,
extern "C"
es vital. En términos prácticos, significa que los nombres usados en referencias externas no serán mutilados, como lo harían los nombres normales de C ++. Referencia.fuente
DESCARGO DE RESPONSABILIDAD: No soy un programador de C ++, sin embargo, conozco C muy bien. Adapté estas llamadas de algún código C que tengo.
También Markdown puso estos _ extraños como mis guiones bajos.
Debería poder escribir una clase de abstracción alrededor de los sockets C con algo como esto:
Luego tenga métodos para abrir, cerrar y enviar paquetes por el socket.
Por ejemplo, la convocatoria abierta podría verse así:
fuente
Use la siguiente bandera c89:
Ejemplo:
Para obtener más información, busque las Opciones de c89 en la Guía del usuario de z / OS XLC / C ++.
fuente