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á > 0
no Linux -1
. A razão está no UNIX, existe um /dev/tcp
. Isso não está presente no Linux. Também no UNIX, esse tcp
arquivo é 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?
Respostas:
t_open()
e seus associados/dev/tcp
fazem parte da interface TLI / XTI , que perdeu a batalha pelas APIs TCP / IP nos soquetes BSD.No Linux, há
/dev/tcp
vá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/tcp
recurso 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
configure
em 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.
fonte
-I
e-L
bandeiras e esperar que ele funcione. Mas se isso não acontecer, eu não gastaria muito tempo nisso.libstrxnet.so.*
:: esse diretório é para o qual você passa-L
. Localizarxti.h
: passe esse diretório para-I
. Você também precisará-lstrxnet
no mínimo. Bottom line: veja os documentos strxnet.