/ dev / tcp no está presente en Linux


9

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á > 0en Linux -1. La razón está en UNIX, hay un /dev/tcp. Esto no está presente en Linux. También en UNIX este tcparchivo 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?


55
¿Hay alguna razón por la que no utiliza los enchufes Berkeley / POSIX ?
jofel

si Jofel En ese caso, necesito modificar una gran cantidad de código existente que no es factible. Estoy buscando el reemplazo de / dev / tcp en Linux o cómo debería crearse en Linux para que funcione como en Unix. A continuación hay información sobre / dev / tcp en Unix.
missingsemicolon

1
¿Cómo compilas tu software? AFAIK en Linux, XTI / TLI solo es compatible con algunas bibliotecas adicionales como Linux Fast Stream de OpenSS7 o emuladores como iBCS . No hay forma de crear simplemente / dev / tcp en Linux. Puede encontrar / dev / tcp usado desde bash, pero en este caso es solo una relicción que le dice a bash que abra un socket tcp. El dispositivo no existe realmente.
jofel

cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet ejecutó la prueba de archivo binario Hay una manera de crear el archivo de caracteres tcp en / dev usando el comando mknod tcp c <x> <y>. En unix, las entradas del dispositivo para tcp son 42,2. es decir, el comando de archivo (file / dev / tcp) muestra "carácter especial (42/2)" donde x = 42 e y = 2. Pero con las mismas entradas que creé en Linux como mknod tcp c 42 2.again socket_id es -1. Aquí el problema son las entradas del dispositivo que se utilizarán en Linux.
missingsemicolon

1
@smilebhuff No es suficiente crear el nodo, alguien en el núcleo debe ser responsable de ello, lo cual no es el caso en Linux.
glglgl

Respuestas:


18

t_open()y sus asociados /dev/tcpy 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/tcpespecie 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/tcpinstalació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 configureen 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.


Warren gracias por sus aportes. Lo siento, soy muy nuevo en estos conceptos de programación de sockets y API. Por favor desnuda con mis preguntas. ¿Qué quieres decir con "strxnet XTI emulation latyer"? Recientemente instalamos uno de los paquetes de strxnet (strxnet-0.9.2.10.tar) para obtener algunas de las bibliotecas / archivos de encabezado openss7. ¿Qué puedo hacer más con eso?
missingsemicolon

Nunca lo he usado yo mismo, pero a partir de un examen rápido del tarball, parece que una vez que está instalado, proporciona una capa de emulación XTI. Debería poder apuntar su compilador con -Iy -Lmarcas y esperar que funcione. Pero si no es así, no le dedicaría mucho tiempo.
Warren Young

Sé acerca de -I y -L, que debe incluir encabezados / bibliotecas, respectivamente. Pero, ¿qué tengo que hacer exactamente aquí con -I / -L? perdón de nuevo si mi pregunta es incorrecta.
missingsemicolon

1
Eso depende de dónde instaló el paquete los archivos. Busque el archivo de la biblioteca libstrxnet.so.*: ese directorio es a lo que pasa -L. Buscar xti.h: pasar ese directorio a -I. También necesitarás -lstrxnetcomo mínimo. En pocas palabras: ver los documentos de strxnet.
Warren Young

Warren, eso es lo que hice durante la compilación. por favor vea los pasos que di en el comando anterior. Esta biblioteca tiene la función t_open (). Pero el problema no es con esta función. El problema es con / dev / tcp que t_open está intentando abrir.
missingsemicolon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.