EPROTOTYPE
以下は、エラー(別名)を生成するコードの断片ですProtocol Wrong Type for Socket
。
そして定義を含む/usr/include
MINIX 3のヘッダと定義を含むwhileの宣言を確認しました。ファイルに両方のヘッダーを慎重に含めましたが、まだ成功しませんでした。sys/socket.h
AF_INET
SOCK_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()
指定された位置にソケットを作成するフィールド。 [...]現在、2つの値がサポートされています。フィールド、PF_INET
インターネットソケットおよびPF_UNIX
ローカルUNIXドメインソケット用。これタイプソケットはSOCK_STREAM
TCPソケットであってもよい。PF_INET
フィールドまたはSOCK_DGRAM
UDPソケットの場合PF_INET
フィールド。 [… ]の価値規約IPPROTO_TCP
TCPソケットまたは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_UDP
IPPROTO_ICMP