Я портирую код C / pro * c из UNIX в Linux. Код является:
#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;
}
В UNIX значение socket_id > 0
в Linux это -1
. Причина в UNIX, есть /dev/tcp
. Этого нет в Linux. Также в UNIX этот tcp
файл является символьным специальным файлом, который отличается от обычного файла.
Есть ли способ создать такой же специальный символьный файл в Linux, как в UNIX, или как это сделать дальше?
Ответы:
t_open()
и связанные с ним/dev/tcp
и тому подобное являются частью интерфейса TLI / XTI , который проиграл битву за API TCP / IP с сокетами BSD.В Linux есть своего
/dev/tcp
рода. Это не настоящий файл или устройство ядра. Это нечто специально предоставленное Bash , и оно существует только для перенаправлений. Это означает, что даже если бы кто-то создал средство в ядре/dev/tcp
, он был бы замаскирован при интерактивном использовании в 99% [*] времени оболочкой.Лучшее решение на самом деле это переключиться на разъемы BSD. Сожалею.
Возможно, вам удастся заставить работать слой эмуляции strxnet XTI , но вам лучше потратить время на выход из XTI . Это мертвый API, не поддерживаемый не только в Linux, но и в BSD, включая OS X.
(Кстати, библиотека strxnet даже не будет построена на BSD, потому что она зависит от LiS , компонента ядра Linux. Она не будет даже
configure
на стандартной системе BSD или OS X, очевидно, потому что она также зависит от GNU sed.)[*] Я основываю это дикое предположение на том факте, что Bash является оболочкой по умолчанию для пользователей без полномочий root во всех дистрибутивах Linux, которые я использовал. Поэтому вам, как правило, придется пойти по пути Linux, чтобы получить что-то, кроме Bash.
источник
-I
и-L
флаги и ожидать, что он будет работать. Но если этого не произойдет, я бы не стал тратить на это много времени.libstrxnet.so.*
: этот каталог - то, что вы передаете-L
. Найтиxti.h
: передать этот каталог-I
. Вам также понадобится-lstrxnet
как минимум. Итог: см. Документацию strxnet.