Ich portiere C / Pro * C-Code von UNIX nach Linux. Der Code lautet:
#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;
}
Unter UNIX ist der Wert von socket_id unter > 0
Linux -1
. Grund ist in UNIX, es gibt eine /dev/tcp
. Dies ist unter Linux nicht vorhanden. Auch unter UNIX ist diese tcp
Datei eine Zeichenspezialdatei, die sich von der normalen Datei unterscheidet.
Gibt es eine Möglichkeit, unter Linux dieselbe Zeichenspezialdatei wie unter UNIX zu erstellen, oder wie geht das weiter?
Antworten:
t_open()
und die zugehörigen/dev/tcp
und solche sind Teil der TLI / XTI-Schnittstelle , die den Kampf um TCP / IP-APIs an BSD-Sockets verloren hat.Unter Linux gibt es eine
/dev/tcp
Art. Es ist keine echte Datei oder ein Kernel-Gerät. Es ist etwas, das speziell von Bash bereitgestellt wird , und es existiert nur für Weiterleitungen. Dies bedeutet, dass selbst wenn eine In-Kernel-/dev/tcp
Einrichtung erstellt wird, diese in 99% [*] der Zeit von der Shell in interaktiver Nutzung maskiert wird.Die beste Lösung ist wirklich, auf BSD-Sockel umzusteigen. Es tut uns leid.
Möglicherweise können Sie die strxnet XTI-Emulationsebene zum Laufen bringen , aber Sie sollten Ihre Zeit besser darauf verwenden, XTI zu verlassen. Es ist eine tote API, die nicht nur unter Linux, sondern auch auf BSDs, einschließlich OS X, nicht unterstützt wird.
(Übrigens wird die strxnet-Bibliothek nicht einmal auf den BSDs aufbauen, da sie von LiS abhängt , einer Komponente des Linux-Kernels. Sie wird nicht einmal
configure
von einem Standard- BSD- oder OS X-System abhängen, anscheinend, weil es auch davon abhängt GNU sed.)[*] Ich begründe diese wilde Vermutung mit der Tatsache, dass Bash die Standard-Shell für Nicht-Root-Benutzer in allen von mir verwendeten Linux-Distributionen ist. Sie müssen sich daher in der Regel unter Linux sehr viel Mühe geben, um etwas anderes als Bash zu bekommen.
quelle
-I
und-L
Flags darauf zu zeigen und zu erwarten, dass es funktioniert. Aber wenn nicht, würde ich nicht viel Zeit darauf werfen.libstrxnet.so.*
: Dieses Verzeichnis wird übergeben-L
. Suchenxti.h
: Übergeben Sie dieses Verzeichnis an-I
. Sie benötigen auch-lstrxnet
mindestens. Fazit: Siehe die strxnet-Dokumente.