以下是我的代码片段,它产生EPROTOTYPE
错误,又名,Protocol Wrong Type for Socket
.
我检查了/usr/include
MINIX 3 中的标头,sys/socket.h
包含AF_INET
和的定义,以及whileSOCK_RAW
的声明包含 的定义。我小心翼翼地将两个标题都包含在我的文件中,但仍然没有成功。socket()
netinet/in.h
IPPROTO_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_STREAM
TCP 套接字PF_INET
领域或者SOCK_DGRAM
对于 UDP 套接字PF_INET
领域。 […] 的价值协议IPPROTO_TCP
对于 TCP 套接字或IPPROTO_UDP
UDP 套接字始终为 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_UDP
IPPROTO_ICMP