在 MINIX 3 中创建原始套接字()时的 EPROTOTYPE (_SIGN 41 )

在 MINIX 3 中创建原始套接字()时的 EPROTOTYPE (_SIGN 41 )

以下是我的代码片段,它产生EPROTOTYPE错误,又名,Protocol Wrong Type for Socket.

我检查了/usr/includeMINIX 3 中的标头,sys/socket.h包含AF_INET和的定义,以及whileSOCK_RAW的声明包含 的定义。我小心翼翼地将两个标题都包含在我的文件中,但仍然没有成功。socket()netinet/in.hIPPROTO_RAW

   // Open internal socket    
        int raw_internal_1 =0; 
        raw_internal_1 = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); 
        if(raw_internal_1 < 0){
            perror("Error[01]: Unable to create socket");
            return 1;
        }
        

错误仅显示:Protocol Wrong Type for Socket

这个错误的定义是 MINIX/sys/sys/errno.h所说的#define EPROTOTYPE (_SIGN 41 ) /* Protocol wrong type for socket */man socket(2)[EPROTOTYPE] The protocol is not supported by the domain.

相同的代码在 Linux 发行版 - Ubuntu 和 Arch 上运行良好。然而,由于我的项目域限制,不幸的是,我不得不坚持使用 Minix。

任何建议都将使我免于进一步的挫败感。

答案1

启动 Minix VM,man 2 socket会显示该功能的手册页socket。其描述如下:

socket()在指定的位置创建一个套接字领域。 [...] 目前支持两个值领域PF_INET用于互联网套接字和PF_UNIX本地 UNIX 域套接字。这类型套接字的可以是SOCK_STREAMTCP 套接字PF_INET 领域或者SOCK_DGRAM对于 UDP 套接字PF_INET 领域。 […] 的价值协议IPPROTO_TCP对于 TCP 套接字或IPPROTO_UDPUDP 套接字始终为 0 。

我只省略了有关的材料PF_UNIX 领域。您可能会注意到,与 Linux 或 macOS 的手册不同,没有提及SOCK_RAW。对我来说,这意味着 Minix 尚未完全支持原始套接字,就像在其他一些系统上一样。

深入研究源代码本身,我们会发现minix/lib/libc/sys/socket.c以下内容:

if (domain == AF_INET && sock_type == SOCK_RAW && protocol == IPPROTO_ICMP)
        return _raw_socket(type, protocol);
if (domain == AF_INET && sock_type == SOCK_RAW && protocol == IPPROTO_UDP)
        return _raw_socket(type, protocol);

因此,对于这两个协议,以及单独的这两个协议,您可以获得原始套接字。事实上,如果用orIPPROTO_RAW替换,您的代码编译和运行不会出现错误。IPPROTO_UDPIPPROTO_ICMP

相关内容