Estoy portando código C / pro * c de UNIX a Linux. El codigo es:
#define __NFDBIT (8 * sizeof(unsigned long))
#define __FD_SETSIZ 1024
#define __FDSET_LONG (__FD_SETSIZ/__NFDBIT)
typedef struct {
unsigned long fds_bits [__FDSET_LONG];
} __ernel_fd_set;
typedef __ernel_fd_set fd_set_1;
int main()
{
fd_set_1 listen_set;
int listen_sd;
int socket_id;
FD_ZERO(&listen_set);
socket_id = t_open("/dev/tcp", O_RDWR|O_NONBLOCK, (struct t_info *) 0);
if ( socket_id <0 )
{
exit(FAILURE);
}
return 0;
}
En UNIX, el valor de socket_id está > 0
en Linux -1
. La razón está en UNIX, hay un /dev/tcp
. Esto no está presente en Linux. También en UNIX este tcp
archivo es un archivo especial de caracteres que es diferente del archivo normal.
¿Hay alguna forma de crear el mismo archivo especial de caracteres en Linux que en UNIX o cómo continuar con esto?
Respuestas:
t_open()
y sus asociados/dev/tcp
y tales son parte de la interfaz TLI / XTI , que perdió la batalla por las API TCP / IP en los sockets BSD.En Linux, hay una
/dev/tcp
especie de. No es un archivo real o dispositivo kernel. Es algo especialmente provisto por Bash , y existe solo para redireccionamientos. Esto significa que incluso si uno creara una/dev/tcp
instalación en el núcleo , el shell la enmascararía en el uso interactivo el 99% [*] del tiempo.La mejor solución es cambiar a tomas BSD. Lo siento.
Es posible que pueda hacer que funcione la capa de emulación strxnet XTI, pero es mejor que dedique su tiempo a salir de XTI. Es una API muerta, no compatible no solo en Linux, sino también en los BSD, incluido OS X.
(Por cierto, la biblioteca strxnet ni siquiera se basará en los BSD, porque depende de LiS , un componente del kernel de Linux. Ni siquiera
configure
en un sistema BSD u OS X estándar, aparentemente porque también depende de GNU sed.)[*] Baso esta suposición salvaje en el hecho de que Bash es el shell predeterminado para usuarios no root en todas las distribuciones de Linux que he usado. Por lo tanto, debe salir de su camino en Linux, por regla general, para obtener algo más que Bash.
fuente
-I
y-L
marcas y esperar que funcione. Pero si no es así, no le dedicaría mucho tiempo.libstrxnet.so.*
: ese directorio es a lo que pasa-L
. Buscarxti.h
: pasar ese directorio a-I
. También necesitarás-lstrxnet
como mínimo. En pocas palabras: ver los documentos de strxnet.