/ dev / tcp não está presente no Linux

9

Estou portando código C / pro * c do UNIX para Linux. O código é:

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

No UNIX, o valor de socket_id está > 0no Linux -1. A razão está no UNIX, existe um /dev/tcp. Isso não está presente no Linux. Também no UNIX, esse tcparquivo é um arquivo especial de caractere diferente do arquivo normal.

Existe alguma maneira de criar o mesmo arquivo especial de caractere no Linux e no UNIX ou como proceder ainda mais?

Faltando ponto-e-vírgula
fonte
5
Existe uma razão para você não usar soquetes Berkeley / soquetes POSIX ?
Jofel
sim Jofel. Nesse caso, preciso modificar grande quantidade de código existente que não é viável. Estou procurando a substituição do / dev / tcp no Linux ou como ele deve ser criado no Linux para fazê-lo funcionar como no Unix. A seguir estão informações sobre / dev / tcp no Unix.
Missingsemicolon
11
Como você compila seu software? AFAIK no Linux, XTI / TLI é suportado apenas por algumas bibliotecas extras como o Linux Fast Stream do OpenSS7 ou emuladores como o iBCS . Não há como simplesmente criar / dev / tcp no Linux. Você pode encontrar o / dev / tcp usado no bash, mas neste caso é apenas um relict que informa ao bash para abrir um soquete tcp. O dispositivo realmente não existe.
Jofel
cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet executado arquivo binário teste Existe uma maneira de criar arquivo de caracteres tcp em / dev usando o comando mknod tcp c <x> <y>. No unix, as entradas de dispositivo para tcp são 42,2. esse é o comando file (file / dev / tcp) mostra "caractere especial (42/2)" em que x = 42 e y = 2. Mas com as mesmas entradas que eu criei no Linux como mknod tcp c 42 2.again socket_id é -1. Aqui o problema são as entradas do dispositivo a serem usadas no Linux.
Missingsemicolon
11
@smilebhuff Não é suficiente criar o nó, alguém no kernel deve ser responsável por ele - o que não é o caso no Linux.
glglgl

Respostas:

18

t_open()e seus associados /dev/tcpfazem parte da interface TLI / XTI , que perdeu a batalha pelas APIs TCP / IP nos soquetes BSD.

No Linux, há /dev/tcpvários tipos. Não é um dispositivo real de arquivo ou kernel. É algo especialmente fornecido pelo Bash e existe apenas para redirecionamentos. Isso significa que, mesmo que alguém criasse um /dev/tcprecurso no kernel , ele seria mascarado no uso interativo 99% [*] do tempo pelo shell.

A melhor solução é realmente mudar para soquetes BSD. Desculpa.

Você pode conseguir que a camada de emulação strxnet XTI funcione, mas é melhor dedicar seu tempo a sair do XTI. É uma API morta, sem suporte não apenas no Linux, mas também nos BSDs, incluindo o OS X.

(A propósito, a biblioteca strxnet nem constrói nos BSDs, porque depende do LiS , um componente do kernel do Linux. Nem mesmo configureem um sistema BSD ou OS X padrão , aparentemente porque também depende de GNU sed.)

[*] Baseei esse palpite no fato de que o Bash é o shell padrão para usuários não raiz em todas as distribuições Linux que eu usei. Portanto, você tem que seguir seu caminho no Linux, como regra, para obter algo diferente do Bash.

Warren Young
fonte
Warren, obrigado por suas contribuições. Desculpe, sou muito novo nesses conceitos de programação e API de soquete. Por favor, fique nu com minhas perguntas. O que você quer dizer com "strxnet XTI emulation latyer" recentemente instalamos um dos pacotes do strxnet (strxnet-0.9.2.10.tar) para obter algumas das bibliotecas openss7 / headerfiles. O que posso fazer mais com isso?
Missingsemicolon
Eu nunca o usei, mas a partir de um rápido exame do tarball, parece que, uma vez instalado, ele fornece uma camada de emulação XTI. Você deve apenas ser capaz de apontar o seu compilador para ele com -Ie -Lbandeiras e esperar que ele funcione. Mas se isso não acontecer, eu não gastaria muito tempo nisso.
Warren Young
Eu sei sobre -I e -L, que deve incluir cabeçalhos / bibliotecas, respectivamente. Mas o que exatamente eu tenho que fazer aqui com -I / -L? desculpe novamente se minha pergunta está errada.
Missingsemicolon
11
Isso depende de onde o pacote instalou os arquivos. Encontre o arquivo da biblioteca libstrxnet.so.*:: esse diretório é para o qual você passa -L. Localizar xti.h: passe esse diretório para -I. Você também precisará -lstrxnetno mínimo. Bottom line: veja os documentos strxnet.
Warren Young
Warren, foi o que fiz durante a compilação. por favor, veja os passos que dei no comando anterior. Esta biblioteca possui a função t_open (). Mas o problema não é com essa função. O problema é com / dev / tcp que t_open está tentando abrir.
Missingsemicolon