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()지정된 위치에 소켓 생성필드. [...] 현재 두 가지 값이 지원됩니다.필드, 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);

따라서 이 두 프로토콜과 이 두 프로토콜만으로도 원시 소켓을 얻을 수 있습니다. 실제로 IPPROTO_RAW이를 or로 바꾸면 코드가 오류 없이 컴파일되고 실행됩니다.IPPROTO_UDPIPPROTO_ICMP

관련 정보