在MINIX 3中創建原始套接字()時的EPROTOTYPE(_SIGN 41)
以下是我產生
EPROTOTYPE
錯誤的程式碼片段,又名Protocol Wrong Type for Socket
.我檢查了
/usr/include
MINIX 3 中的標題,sys/socket.h
包含 and 的定義AF_INET
,SOCK_RAW
而聲明socket()
whilenetinet/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
.這個錯誤被定義
/sys/sys/errno.h
為#define EPROTOTYPE (_SIGN 41 ) /* Protocol wrong type for socket */
MINIXman socket(2)
說[EPROTOTYPE] The protocol is not supported by the domain.
相同的程式碼在 Linux 發行版 - Ubuntu 和 Arch 上執行良好。但是,由於我的項目域限制,不幸的是,我將不得不堅持使用 Minix。
任何建議都會使我免於進一步沮喪。
啟動 Minix VM,
man 2 socket
會顯示該socket
功能的手冊頁。其描述如下:
socket()
在指定域中創建一個套接字。$$ … $$目前, domain、
PF_INET
internet sockets 和PF_UNIX
local unix domain sockets支持兩個值。套接字的類型可以是域中SOCK_STREAM
的 TCP 套接字或PF_INET
域中SOCK_DGRAM
的 UDP 套接字。PF_INET
$$ … $$protocol的值始終為 0,或者IPPROTO_TCP
對於 TCP 套接字或IPPROTO_UDP
UDP 套接字。我只省略了有關
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);
因此,對於這兩個協議,並且僅這兩個協議,您可以獲得原始套接字。
IPPROTO_RAW
事實上,如果替換為IPPROTO_UDP
or ,您的程式碼編譯和執行不會出錯IPPROTO_ICMP
。