MINIX 3で生のソケット()を生成するときのEPROTOTYPE(_SIGN 41)

MINIX 3で生のソケット()を生成するときのEPROTOTYPE(_SIGN 41)

EPROTOTYPE以下は、エラー(別名)を生成するコードの断片ですProtocol Wrong Type for Socket

そして定義を含む/usr/includeMINIX 3のヘッダと定義を含むwhileの宣言を確認しました。ファイルに両方のヘッダーを慎重に含めましたが、まだ成功しませんでした。sys/socket.hAF_INETSOCK_RAWsocket()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()指定された位置にソケットを作成するフィールド。 [...]現在、2つの値がサポートされています。フィールドPF_INETインターネットソケットおよびPF_UNIXローカルUNIXドメインソケット用。これタイプソケットはSOCK_STREAMTCPソケットであってもよい。PF_INET フィールドまたはSOCK_DGRAMUDPソケットの場合PF_INET フィールド。 [… ]の価値規約IPPROTO_TCPTCPソケットまたはUDPソケットの場合はIPPROTO_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);

したがって、これら2つのプロトコルとこれら2つのプロトコルだけで生のソケットを取得できます。実際にIPPROTO_RAWこれをorに置き換えると、コードはエラーなしでコンパイルされ実行されます。IPPROTO_UDPIPPROTO_ICMP

関連情報