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 > 0
w Linuksie -1
. Powodem jest UNIX, istnieje /dev/tcp
. Tego nie ma w systemie Linux. Również w systemie UNIX ten tcp
plik 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?
Odpowiedzi:
t_open()
i powiązane z nim elementy/dev/tcp
są częścią interfejsu TLI / XTI , który przegrał bitwę o interfejsy API TCP / IP z gniazdami BSD.W systemie Linux istnieje pewien
/dev/tcp
rodzaj. 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
configure
na 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.
źródło
-I
oraz-L
flagi i oczekują go do pracy. Ale jeśli nie, nie poświęciłbym temu dużo czasu.libstrxnet.so.*
: ten katalog jest tym, co przekazujesz-L
. Znajdźxti.h
: przekaż ten katalog do-I
. Będziesz także potrzebował-lstrxnet
co najmniej. Konkluzja: zobacz dokumenty strxnet.