Networking

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

  • August 7, 2022

以下是我產生EPROTOTYPE錯誤的程式碼片段,又名Protocol Wrong Type for Socket.

我檢查了/usr/includeMINIX 3 中的標題,sys/socket.h包含 and 的定義AF_INETSOCK_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()在指定域中創建一個套接字。

$$ … $$目前, domainPF_INETinternet sockets 和PF_UNIXlocal unix domain sockets支持兩個值。套接字的類型可以是域中SOCK_STREAM的 TCP 套接字或PF_INET 域中SOCK_DGRAM的 UDP 套接字。PF_INET $$ … $$protocol的值始終為 0,或者IPPROTO_TCP對於 TCP 套接字或IPPROTO_UDPUDP 套接字。

我只省略了有關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_UDPor ,您的程式碼編譯和執行不會出錯IPPROTO_ICMP

引用自:https://unix.stackexchange.com/questions/712578