/ 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 2012年

是的,Jofel。在那种情况下,我需要修改大量不可行的现有代码。我正在寻找在Linux中替换/ dev / tcp的方法,或者在Linux中如何创建它以使其与Unix一样工作。以下是有关Unix中/ dev / tcp的信息。
missings分号2012年

1
您如何编译软件?Linux上的AFAIK,XTI / TLI仅受某些额外的库支持,例如来自OpenSS7的Linux Fast Stream或诸如iBCS的模拟器。无法在Linux上简单地创建/ dev / tcp。您可能会发现bash使用了/ dev / tcp,但在这种情况下,它只是一个遗物,告诉bash打开tcp套接字。该设备实际上不存在。
2012年

cc tet.o -o test-L $ ORACLE_HOME / lib64 -lxnet执行的二进制文件测试有一种方法可以使用命令mknod tcp c <x> <y>在/ dev下创建字符文件tcp。在unix中,tcp的设备条目为42,2。即文件命令(文件/ dev / tcp)显示“特殊字符(42/2)”,其中x = 42,y = 2。但是使用与我在Linux中创建的相同条目相同的名称,即mknod tcp c 422。socket_id为-1。这里的问题是要在Linux上使用的设备条目。
missings分号2012年

1
@smilebhuff创建节点是不够的,内核中的某个人必须对此负责-在Linux中情况并非如此。
glglgl 2012年

Answers:


18

t_open()及其相关的内容/dev/tcp等是TLI / XTI接口的一部分则失去了将TCP / IP API传输到BSD套接字的斗争。

在Linux上,有一种/dev/tcp。它不是真实的文件或内核设备。它是Bash专门提供的,仅用于重定向。这意味着即使要创建一个内核/dev/tcp工具,shell也会在99%[*]的时间内以交互方式屏蔽它。

最好的解决方案实际上是切换到BSD插槽。抱歉。

您可能能够获得strxnet XTI仿真层正常工作,但最好还是花点时间开始使用XTI。这是一个已失效的API,不仅在Linux上而且在包括OS X在内的BSD上均不受支持。

(顺便说一下,strxnet库甚至不会建立在BSD上,因为它依赖于Linux内核的组成部分LiS。它甚至不会configure取决于库存的BSD或OS X系统,显然是因为它也依赖于GNU sed。)

[*]我大胆猜测是因为Bash是我使用过的所有Linux发行版中非root用户的默认外壳。因此,通常,您必须在Linux上摆脱困境,以获取除Bash之外的其他东西。


沃伦感谢您的投入。抱歉,我对这些套接字编程和API概念非常陌生。请提出我的问题。您所说的“ strxnet XTI仿真层”是什么意思,我们最近安装了其中一个strxnet软件包(strxnet-0.9.2.10.tar)来获取一些openss7库/头文件。对此我还能做些什么?
missings分号

我从来没有亲自使用过它,但是从快速查看tarball来看,它看起来一旦安装,便提供了XTI仿真层。您应该只能够使用-I-L标志将编译器指向它,并期望它能够工作。但是,如果没有,我不会花很多时间。
沃伦·杨

我知道-I和-L分别包含标题/库。但是,我在这里与-I / -L到底有什么关系呢?如果我的问题有误,请再次抱歉。
missings分号

1
这取决于软件包在何处安装了文件。找到库文件libstrxnet.so.*:该目录就是您要传递的目录-L。查找xti.h:将该目录传递到-I。您也将-lstrxnet至少需要。底线:请参阅strxnet文档。
沃伦·杨

沃伦,那是我在编译过程中所做的。请参阅我在上一个命令中给出的步骤。该库具有t_open()函数。但是问题不在于此功能。问题是/ dev / tcp试图打开t_open。
missings分号2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.