/ dev / tcp não presente no Linux

9

Estou portando o código C / pro * c do UNIX para o 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 é > 0 no Linux, é -1 . O motivo é no UNIX, há um /dev/tcp . Isso não está presente no Linux. Também no UNIX este arquivo tcp é um arquivo especial de caractere que é diferente do arquivo normal.

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

    
por smileybhuff 16.05.2012 / 13:07

1 resposta

18

t_open() e seus /dev/tcp associados e tal fazem parte da interface TLI / XTI , que perdeu a batalha das APIs TCP / IP para os sockets BSD.

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

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

Você pode conseguir que a camada de emulação XTI do strxnet funcione, mas é melhor dar o seu tempo para 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 do strxnet nem vai construir nos BSDs, porque depende de LiS , um componente do kernel do Linux.Não vai mesmo configure em um sistema BSD ou OS X, aparentemente porque também depende do GNU sed.

[*] Eu baseei esse palpite sobre o fato de que o Bash é o shell padrão para usuários não-root em todas as distribuições Linux que eu usei. Você, portanto, tem que sair do seu caminho no Linux, como regra, para obter algo diferente do Bash.

    
por 16.05.2012 / 13:59

Tags