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 > 0
sous 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 tcp
fichier 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?
Réponses:
t_open()
et ses associés/dev/tcp
et 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/tcp
sorte. 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/tcp
installation 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
configure
d'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.
la source
-I
et-L
indicateurs et vous attendre à ce qu'il fonctionne. Mais si ce n'est pas le cas, je n'y consacrerais pas beaucoup de temps.libstrxnet.so.*
ce répertoire est celui vers lequel vous passez-L
. Rechercherxti.h
: passez ce répertoire à-I
. Vous aurez également besoin-lstrxnet
au minimum. Conclusion: voir les documents strxnet.