/ dev / tcp ist unter Linux nicht vorhanden

9

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 > 0Linux -1. Grund ist in UNIX, es gibt eine /dev/tcp. Dies ist unter Linux nicht vorhanden. Auch unter UNIX ist diese tcpDatei 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?

fehlendes Semikolon
quelle
5
Gibt es einen Grund, warum Sie keine Berkeley-Sockets / POSIX-Sockets verwenden ?
Jofel
ja Jofel. In diesem Fall muss ich eine große Menge des vorhandenen Codes ändern, was nicht möglich ist. Ich suche nach einem Ersatz für / dev / tcp unter Linux oder wie es unter Linux erstellt werden sollte, damit es wie unter Unix funktioniert. Im Folgenden finden Sie Informationen zu / dev / tcp unter Unix.
Missingsemicolon
1
Wie kompilieren Sie Ihre Software? AFAIK unter Linux, XTI / TLI wird nur von einigen zusätzlichen Bibliotheken wie Linux Fast Stream von OpenSS7 oder Emulatoren wie iBCS unterstützt . Es gibt keine Möglichkeit, / dev / tcp unter Linux einfach zu erstellen. Möglicherweise finden Sie / dev / tcp, das von bash verwendet wird, aber in diesem Fall ist es nur ein Relikt, das bash anweist, einen tcp-Socket zu öffnen. Das Gerät existiert nicht wirklich.
Jofel
cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet Test mit Binärdatei ausgeführt Es gibt eine Möglichkeit, die Zeichendatei tcp unter / dev mit dem Befehl mknod tcp c <x> <y> zu erstellen. Unter Unix sind die Geräteeinträge für TCP 42,2. Das heißt, der Dateibefehl (file / dev / tcp) zeigt "Zeichen speziell (42/2)", wobei x = 42 und y = 2. Aber mit den gleichen Einträgen, die ich unter Linux erstellt habe wie mknod tcp c 42 2.again socket_id ist -1. Hier besteht das Problem darin, Geräteeinträge unter Linux zu verwenden.
Missingsemicolon
1
@smilebhuff Es reicht nicht aus, den Knoten zu erstellen, jemand im Kernel muss dafür verantwortlich sein - was unter Linux nicht der Fall ist.
glglgl

Antworten:

18

t_open()und die zugehörigen /dev/tcpund 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/tcpArt. 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/tcpEinrichtung 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 configurevon 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.

Warren Young
quelle
Warren, danke für deine Beiträge. Entschuldigung, ich bin sehr neu in diesen Socket-Programmier- und API-Konzepten. Bitte entblößen Sie meine Fragen. Was meinst du mit "strxnet XTI Emulation Latyer"? Wir haben kürzlich eines der Pakete von strxnet (strxnet-0.9.2.10.tar) installiert, um einige der openss7-Bibliotheken / Header-Dateien zu erhalten. Was kann ich damit mehr tun?
Missingsemicolon
Ich habe es selbst nie benutzt, aber nach einer kurzen Untersuchung des Tarballs sieht es so aus, als ob es nach der Installation eine XTI-Emulationsebene bereitstellt. Sie sollten nur in der Lage sein, Ihren Compiler mit -Iund -LFlags darauf zu zeigen und zu erwarten, dass es funktioniert. Aber wenn nicht, würde ich nicht viel Zeit darauf werfen.
Warren Young
Ich kenne -I und -L, die jeweils Header / Bibliotheken enthalten sollen. Aber was genau habe ich hier mit -I / -L zu tun? Entschuldigung nochmal, wenn meine Frage falsch ist.
Missingsemicolon
1
Das hängt davon ab, wo das Paket die Dateien installiert hat. Suchen Sie die Bibliotheksdatei libstrxnet.so.*: Dieses Verzeichnis wird übergeben -L. Suchen xti.h: Übergeben Sie dieses Verzeichnis an -I. Sie benötigen auch -lstrxnetmindestens. Fazit: Siehe die strxnet-Dokumente.
Warren Young
Warren, das habe ich während der Kompilierung gemacht. Bitte beachten Sie die Schritte, die ich im vorherigen Befehl gegeben habe. Diese Bibliothek hat die Funktion t_open (). Das Problem liegt aber nicht bei dieser Funktion. Das Problem ist mit / dev / tcp, das t_open zu öffnen versucht.
Missingsemicolon