/ dev / tcp отсутствует в Linux

9

Я портирую код 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, или как это сделать дальше?

missingsemicolon
источник
5
Есть ли причина, по которой вы не используете сокеты Berkeley / POSIX ?
Джофель
да, Джофель В этом случае мне нужно изменить большой объем существующего кода, что невозможно. Я ищу замену / dev / tcp в Linux или как она должна быть создана в Linux, чтобы она работала как в Unix. Ниже приведена информация о / dev / tcp в Unix.
точка с запятой
1
Как вы компилируете свое программное обеспечение? AFAIK в Linux, XTI / TLI поддерживается только некоторыми дополнительными библиотеками, такими как Linux Fast Stream из OpenSS7, или эмуляторами, такими как iBCS . Нет никакого способа просто создать / dev / tcp в Linux. Вы можете найти / dev / tcp из bash, но в этом случае это просто реликт, который говорит bash открыть tcp-сокет. Устройство на самом деле не существует.
Джофель
cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet выполнил тест двоичного файла Есть способ создать символьный файл tcp в / dev с помощью команды mknod tcp c <x> <y>. В Unix записи устройства для TCP являются 42,2. то есть команда file (file / dev / tcp) показывает «специальный символ (42/2)», где x = 42 и y = 2. Но с теми же записями, которые я создал в Linux как mknod tcp c 42 2.again socket_id равен -1. Здесь проблема заключается в записи устройства для использования Linux.
точка с запятой
1
@smilebhuff Недостаточно создать узел, кто-то в ядре должен нести за него ответственность, а в Linux это не так.
glglgl

Ответы:

18

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.

Уоррен Янг
источник
Уоррен, спасибо за ваш вклад. Извините, я очень новичок в этих концепциях программирования сокетов и API. Пожалуйста, обнажите мои вопросы. Что вы подразумеваете под «латиноамериканским эмулятором strxnet XTI»? Мы недавно установили один из пакетов strxnet (strxnet-0.9.2.10.tar), чтобы получить некоторые из библиотек / заголовочных файлов openss7. Что я могу еще сделать с этим?
пропущена точка с запятой
Я никогда не использовал его сам, но после быстрого изучения tarball, похоже, что после установки он обеспечивает уровень эмуляции XTI. Вы должны просто иметь возможность указать компилятору на него -Iи -Lфлаги и ожидать, что он будет работать. Но если этого не произойдет, я бы не стал тратить на это много времени.
Уоррен Янг
Я знаю о -I и -L, которые должны включать заголовки / библиотеки соответственно. Но что конкретно я должен делать здесь с -I / -L? извините еще раз, если мой вопрос не так.
точка с запятой
1
Это зависит от того, где пакет установил файлы. Найдите файл библиотеки libstrxnet.so.*: этот каталог - то, что вы передаете -L. Найти xti.h: передать этот каталог -I. Вам также понадобится -lstrxnetкак минимум. Итог: см. Документацию strxnet.
Уоррен Янг
Уоррен, это то, что я сделал во время компиляции. пожалуйста, посмотрите шаги, которые я дал в предыдущей команде. Эта библиотека имеет функцию t_open (). Но проблема не с этой функцией. Проблема с / dev / tcp, которую пытается открыть t_open.
пропущена точка с запятой