/ dev / tcp non présent sous Linux


9

Je porte du code C / pro * c d'UNIX vers Linux. Le code est:

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

Sous UNIX, la valeur de socket_id est > 0sous Linux -1. La raison est sous UNIX, il y a un /dev/tcp. Ce n'est pas présent sur Linux. Également sous UNIX, ce tcpfichier est un fichier spécial de caractères différent du fichier normal.

Existe-t-il un moyen de créer le même fichier spécial de caractères sous Linux que sous UNIX ou comment procéder plus loin?


5
Y a-t-il une raison pour laquelle vous n'utilisez pas les sockets Berkeley / sockets POSIX ?
jofel

oui Jofel. Dans ce cas, je dois modifier une grande quantité de code existant, ce qui n'est pas possible. Je cherche le remplacement de / dev / tcp sous Linux ou comment il devrait être créé sous Linux pour le faire fonctionner comme sous Unix. Voici des informations sur / dev / tcp sous Unix.
missingsemicolon

1
Comment compilez-vous votre logiciel? AFAIK sous Linux, XTI / TLI n'est pris en charge que par certaines bibliothèques supplémentaires comme Linux Fast Stream d'OpenSS7 ou des émulateurs comme iBCS . Il n'y a aucun moyen de simplement créer / dev / tcp sous Linux. Vous pouvez trouver / dev / tcp utilisé depuis bash, mais dans ce cas, c'est juste une relique qui dit à bash d'ouvrir une socket tcp. L'appareil n'existe pas vraiment.
jofel

cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet test de fichier binaire exécuté Il existe un moyen de créer un fichier de caractères tcp sous / dev en utilisant la commande mknod tcp c <x> <y>. Sous Unix, les entrées de périphérique pour TCP sont 42,2. c'est-à-dire que la commande file (file / dev / tcp) affiche "caractère spécial (42/2)" où x = 42 et y = 2. Mais avec les mêmes entrées que j'ai créées sous Linux comme mknod tcp c 42 2. à nouveau socket_id est -1. Ici, le problème est les entrées de périphériques à utiliser Linux.
missingsemicolon

1
@smilebhuff Il ne suffit pas de créer le nœud, quelqu'un dans le noyau doit en être responsable - ce qui n'est pas le cas sous Linux.
glglgl

Réponses:


18

t_open()et ses associés /dev/tcpet autres font partie de l' interface TLI / XTI , qui a perdu la bataille pour les API TCP / IP aux sockets BSD.

Sous Linux, il y en a une /dev/tcpsorte. Ce n'est pas un vrai fichier ou un périphérique noyau. C'est quelque chose de spécialement fourni par Bash , et il n'existe que pour les redirections. Cela signifie que même si l'on devait créer une /dev/tcpinstallation dans le noyau , elle serait masquée dans une utilisation interactive 99% [*] du temps par le shell.

La meilleure solution est vraiment de passer aux sockets BSD. Désolé.

Vous pourrez peut-être faire fonctionner la couche d'émulation strxnet XTI, mais vous feriez mieux de consacrer votre temps à quitter XTI. C'est une API morte, non prise en charge non seulement sur Linux, mais aussi sur les BSD, y compris OS X.

(Soit dit en passant, la bibliothèque strxnet ne s'appuiera même pas sur les BSD, car elle dépend de LiS , un composant du noyau Linux. Elle ne dépendra même pas configured'un système BSD ou OS X d'origine, apparemment parce qu'elle dépend également de GNU sed.)

[*] Je base cette supposition sauvage sur le fait que Bash est le shell par défaut pour les utilisateurs non root dans toutes les distributions Linux que j'ai utilisées. Vous devez donc sortir de votre chemin sur Linux, en règle générale, pour obtenir autre chose que Bash.


Warren merci pour vos contributions. Désolé, je suis très nouveau dans ces concepts de programmation de socket et d'API. S'il vous plaît nu avec mes questions. Que voulez-vous dire par «strxnet XTI emulation latyer», nous avons récemment installé l'un des packages de strxnet (strxnet-0.9.2.10.tar) pour obtenir certaines des bibliothèques / fichiers d'en-tête openss7. Que puis-je faire de plus?
missingsemicolon

Je ne l'ai jamais utilisé moi-même, mais d'un examen rapide de l'archive tar, il semble qu'une fois installé, il fournit une couche d'émulation XTI. Vous devriez juste pouvoir pointer votre compilateur vers lui avec -Iet -Lindicateurs et vous attendre à ce qu'il fonctionne. Mais si ce n'est pas le cas, je n'y consacrerais pas beaucoup de temps.
Warren Young

Je connais -I et -L qui doit inclure respectivement les en-têtes / bibliothèques. Mais que dois-je faire exactement ici avec -I / -L? désolé encore si ma question est fausse.
missingsemicolon

1
Cela dépend de l'endroit où le package a installé les fichiers. Trouvez le fichier de bibliothèque,: libstrxnet.so.*ce répertoire est celui vers lequel vous passez -L. Rechercher xti.h: passez ce répertoire à -I. Vous aurez également besoin -lstrxnetau minimum. Conclusion: voir les documents strxnet.
Warren Young

Warren, c'est ce que j'ai fait pendant la compilation. veuillez voir les étapes que j'ai données dans la commande précédente. Cette bibliothèque a la fonction t_open (). Mais le problème n'est pas avec cette fonction. Le problème est avec / dev / tcp que t_open essaie d'ouvrir.
missingsemicolon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.