/ 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, або як продовжити це далі?


5
Чи є причина, чому ви не використовуєте розетки Berkeley / POSIX ?
jofel

так, Йофеле. У такому випадку мені потрібно змінити велику кількість існуючого коду, що неможливо. Я шукаю заміни / 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-розетку. Пристрій насправді не існує.
jofel

cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet виконаний тест бінарних файлів Існує спосіб створити файл символів tcp під / dev за допомогою команди mknod tcp c <x> <y>. У Unix записи пристрою для tcp становлять 42,2. тобто файлова команда (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 не буде навіть будувати на BSDs, тому що це залежить від LiS , компонент ядра Linux. Це не буде навіть configureна складі BSD або системи OS X, по- видимому , тому , що це також залежить від Сед. ГНУ)

[*] Я базую цю дику здогадку на тому, що Bash - це оболонка за замовчуванням для некорінних користувачів у всіх дистрибутивах Linux, якими я користувався. Тому, як правило, вам доведеться вийти зі свого шляху в Linux, щоб отримати щось інше, ніж Bash.


Воррен, дякую за ваші вклади. Вибачте, я дуже новачок у програмах розробки сокетів та API. Будь ласка, голі з моїми питаннями. Що ви маєте на увазі під "strxnet XTI emulation latyer", ми нещодавно встановили один із пакетів strxnet (strxnet-0.9.2.10.tar), щоб отримати кілька бібліотек opens7 / headerfiles. Що я можу зробити з цим більше?
зник безрезультат

Я ніколи не використовував його сам, але після швидкого вивчення тарболу, схоже, що після його встановлення він забезпечує шар емуляції XTI. Ви повинні просто мати змогу навести на нього компілятор -Iі -Lпрапори та очікувати, що він буде працювати. Але якщо це не так, я б не кидав на це багато часу.
Воррен Янг

Я знаю про -I та -L, які мають включати заголовки / бібліотеки відповідно. Але що саме я маю тут робити з -I / -L? Вибачте ще раз, якщо моє запитання неправильне.
зник безрезультат

1
Це залежить від того, де в пакеті встановлені файли. Знайдіть файл бібліотеки,: в libstrxnet.so.*цей каталог ви переходите -L. Знайдіть xti.h: передайте цей каталог у -I. Вам також знадобиться -lstrxnetмінімум. Підсумок: перегляньте документи strxnet.
Воррен Янг

Уоррен, саме це я зробив під час компіляції. будь ласка, подивіться кроки, які я дав у попередній команді. Ця бібліотека має функцію t_open (). Але проблема не в цій функції. Проблема полягає у / dev / tcp, який t_open намагається відкрити.
відсутнійсемиколон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.