/ dev / tcp nie występuje w systemie Linux

9

Przesyłam kod C / pro * c z systemu UNIX do systemu Linux. Kod to:

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

W UNIX wartość parametru socket_id jest > 0w Linuksie -1. Powodem jest UNIX, istnieje /dev/tcp. Tego nie ma w systemie Linux. Również w systemie UNIX ten tcpplik jest znakiem specjalnym, który różni się od zwykłego pliku.

Czy istnieje jakiś sposób na utworzenie tego samego specjalnego pliku znaków w systemie Linux jak w systemie UNIX lub jak to zrobić dalej?

brakujący średnik
źródło
5
Czy istnieje powód, dla którego nie korzystasz z gniazd Berkeley / gniazd POSIX ?
jofel
tak Jofel. W takim przypadku muszę zmodyfikować dużą ilość istniejącego kodu, co nie jest możliwe. Szukam zamiany / dev / tcp w Linuksie lub tego, jak powinien zostać utworzony w Linuksie, aby działał jak w Uniksie. Poniżej znajdują się informacje o / dev / tcp w Uniksie.
missingsemicolon
1
Jak skompilujesz swoje oprogramowanie? AFAIK w systemie Linux, XTI / TLI jest obsługiwany tylko przez niektóre dodatkowe biblioteki, takie jak Linux Fast Stream z OpenSS7 lub emulatory, takie jak iBCS . Nie ma sposobu, aby po prostu utworzyć / dev / tcp w systemie Linux. Możesz znaleźć / dev / tcp używane z bash, ale w tym przypadku jest to tylko relikt, który mówi bashowi, aby otworzył gniazdo tcp. Urządzenie tak naprawdę nie istnieje.
jofel
cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet wykonany test pliku binarnego Istnieje sposób na utworzenie pliku znaków tcp w / dev za pomocą polecenia mknod tcp c <x> <y>. W unixie wpisy urządzenia dla tcp to 42,2. to znaczy polecenie pliku (plik / dev / tcp) pokazuje „znak specjalny (42/2)”, gdzie x = 42 i y = 2. Ale z tymi samymi wpisami, które utworzyłem w Linuksie, jak mknod tcp c 42 2. znowu gniazdo_id to -1. Tutaj problemem są wpisy urządzeń, które będą używane w systemie Linux.
missingsemicolon
1
@smilebhuff Nie wystarczy stworzyć węzeł, ktoś w jądrze musi być za to odpowiedzialny - co nie ma miejsca w Linuksie.
glglgl

Odpowiedzi:

18

t_open()i powiązane z nim elementy /dev/tcpsą częścią interfejsu TLI / XTI , który przegrał bitwę o interfejsy API TCP / IP z gniazdami BSD.

W systemie Linux istnieje pewien /dev/tcprodzaj. To nie jest prawdziwy plik lub urządzenie jądra. Jest to coś specjalnie dostarczonego przez Bash i istnieje tylko w przypadku przekierowań. Oznacza to, że nawet gdyby stworzyć funkcję wbudowaną w jądro /dev/tcp, powłoka byłaby maskowana w interaktywnym użyciu przez 99% [*] czasu.

Najlepszym rozwiązaniem jest przejście na gniazda BSD. Przepraszam.

Być może uda Ci się uruchomić warstwę emulacji strxnet XTI, ale lepiej jest poświęcić czas na zejście z XTI. To martwy interfejs API, nieobsługiwany nie tylko w systemie Linux, ale także w BSD, w tym OS X.

(Nawiasem mówiąc, biblioteka strxnet nawet nie zbuduje się na BSD, ponieważ zależy od LiS , komponentu jądra Linux. Nie będzie nawet configurena standardowym systemie BSD lub OS X, najwyraźniej dlatego, że zależy również od GNU sed.)

[*] Dzikie przypuszczam, że Bash jest domyślną powłoką dla użytkowników innych niż root we wszystkich dystrybucjach Linuksa, których użyłem. Dlatego z reguły musisz zejść z drogi, aby uzyskać coś innego niż Bash.

Warren Young
źródło
Warren dzięki za twoje wkłady. Przepraszam, jestem bardzo nowy w programowaniu gniazd i koncepcjach API. Proszę obnaż moje pytania. Co rozumiesz przez „narzędzie do emulacji strxnet XTI” niedawno zainstalowaliśmy jeden z pakietów strxnet (strxnet-0.9.2.10.tar), aby uzyskać niektóre biblioteki / pliki nagłówkowe openss7. Co mogę z tym zrobić?
missingsemicolon
Nigdy go nie używałem, ale po szybkim zbadaniu tarballa wygląda na to, że po zainstalowaniu zapewnia warstwę emulacji XTI. Trzeba po prostu być w stanie wskazać kompilatorowi na niego z -Ioraz -Lflagi i oczekują go do pracy. Ale jeśli nie, nie poświęciłbym temu dużo czasu.
Warren Young
Wiem o -I i -L, które mają zawierać odpowiednio nagłówki / biblioteki. Ale co dokładnie mam tutaj zrobić z -I / -L? przepraszam jeszcze raz, jeśli moje pytanie jest błędne.
missingsemicolon
1
To zależy od tego, gdzie pakiet zainstalował pliki. Znajdź plik biblioteki libstrxnet.so.*: ten katalog jest tym, co przekazujesz -L. Znajdź xti.h: przekaż ten katalog do -I. Będziesz także potrzebował -lstrxnetco najmniej. Konkluzja: zobacz dokumenty strxnet.
Warren Young
Warren, to właśnie zrobiłem podczas kompilacji. proszę zobaczyć kroki, które podałem w poprzednim poleceniu. Ta biblioteka ma funkcję t_open (). Ale problem nie dotyczy tej funkcji. Problem dotyczy / dev / tcp, które t_open próbuje otworzyć.
missingsemicolon