我正在将 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;
}
Run Code Online (Sandbox Code Playgroud)
在 UNIX 中,socket_id 的值> 0在 Linux 中是-1。原因是在 UNIX 中,有一个/dev/tcp. 这在 Linux 上不存在。同样在 UNIX 中,此tcp文件是与普通文件不同的字符特殊文件。
有没有办法在 Linux 中创建与 UNIX 中相同的字符特殊文件,或者如何进一步进行?
War*_*ung 20
t_open()和它相关的/dev/tcp等等是TLI/XTI 接口的一部分,它在 TCP/IP API 到 BSD 套接字的战斗中失败了。
在 Linux 上,有/dev/tcp各种各样的。它不是真正的文件或内核设备。它是Bash 专门提供的东西,它仅用于重定向。这意味着即使要在内核中创建/dev/tcp工具,它也会在 99%[*] 的时间被 shell 在交互式使用中被屏蔽。
最好的解决方案确实是切换到 BSD 套接字。对不起。
您也许可以让strxnet XTI 仿真层工作,但最好把时间花在离开 XTI 上。这是一个死的 API,不仅在 Linux 上不受支持,在 BSD 上也不受支持,包括 OS X。
(顺便说一句, strxnet 库甚至不会建立在 BSD 上,因为它依赖于LiS,Linux 内核的一个组件。它甚至不会configure在股票 BSD 或 OS X 系统上,显然是因为它也依赖于GNU sed。)
[*] 我的这个疯狂猜测是基于这样一个事实,即 Bash 是我使用过的所有 Linux 发行版中非 root 用户的默认 shell。因此,作为一项规则,您必须在 Linux 上竭尽全力,以获得 Bash 以外的东西。
| 归档时间: |
|
| 查看次数: |
6046 次 |
| 最近记录: |