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()
지정된 위치에 소켓 생성필드. [...] 현재 두 가지 값이 지원됩니다.필드,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);
따라서 이 두 프로토콜과 이 두 프로토콜만으로도 원시 소켓을 얻을 수 있습니다. 실제로 IPPROTO_RAW
이를 or로 바꾸면 코드가 오류 없이 컴파일되고 실행됩니다.IPPROTO_UDP
IPPROTO_ICMP