Linux 中不存在 /dev/tcp

Linux 中不存在 /dev/tcp

我正在将 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 中相同的字符特殊文件,或者如何进一步进行?

答案1

t_open()及其相关的/dev/tcp内容是TLI/XTI 接口,它在 TCP/IP API 与 BSD 套接字的争夺战中失败了。

在 Linux 上,有/dev/tcp各种各样的。它不是真正的文件或内核设备。这是一个东西Bash 特别提供,并且它仅用于重定向。这意味着即使要创建一个内核内/dev/tcp设施,它也会在 99%[*] 的时间里被 shell 屏蔽在交互式使用中。

最好的解决方案确实是切换到 BSD 套接字。对不起。

您也许能够得到星网XTI 模拟层可以工作,但您最好花时间摆脱 XTI。这是一个死 API,不仅在 Linux 上不受支持,而且在 BSD(包括 OS X)上也不受支持。

(顺便说一句,strxnet 库甚至不会构建在 BSD 上,因为它依赖于锂硫,Linux 内核的一个组件。它甚至不会configure在普通的 BSD 或 OS X 系统上运行,显然是因为它也依赖于 GNU sed。)

[*] 我的这种疯狂猜测是基于这样一个事实:Bash 是我使用过的所有 Linux 发行版中非 root 用户的默认 shell。因此,通常来说,在 Linux 上你必须不遗余力地获取 Bash 以外的东西。

相关内容