2011-10-06 2 views
2

I 설정을 사용하여 원시 패킷 소켓 다음 : 다음설정 IP_HDRINCL이라는

sockFd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); 

내가 사용하는 소켓 옵션 IP_HDRINCL을 설정하려고 :

int one = 1; 
if (setsockopt (sockFd, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) < 0) 
    LogPrint(LOG_UNKNOWN,"Warning: Cannot set HDRINCL!\n"); 

하지만 드릴 수 없습니다 이 옵션을 설정하려면 (errno 92로 오류가 발생하고 "프로토콜을 사용할 수 없음"이라는 메시지가 나타납니다. PF_PACKETPF_INET으로 변경하면 옵션이 설정되지만 PF_PACKET을 사용해야합니다.이 옵션을 설정하는 방법은 다음과 같습니다. 위에 만든 소켓?

감사합니다.

+2

필자는 이것 (전혀)에 대해서는 모르겠지만 실제로 PF_PACKET 소켓에이 옵션이 맞습니까? – Mat

+0

나도 잘 모르겠다. ... 이것은 내가 일하는 다른 사람의 코드이다. 뭐 좀 물어봐도 될까요? PF_PACKET을 올바르게 사용하고있을 때 커널이 ip 헤더를 추가하지 않는다는 것을 이해합니까? 커널이 헤더를 추가합니까? 아니면 수동으로해야합니까? 원본 주소 및 대상 주소 등을 보유하고 있습니까? 고마워요. – mtahmed

+0

예. PF_PACKET 소켓이 커널에 의해 추가 된 헤더를 얻지 못한다는 것을 이해합니다. "OSI 레이어"가 무엇인지 확실하지 않습니다. 직접 헤더를 만들어야하며, 처리해야하는 헤더를 정확히 파악하기 위해 문서를 읽어야합니다. – Mat

답변

3

PF_PACKET 소켓에는 설정할 질문에서 묻지 않은 옵션이 없습니다. 해당 옵션은 PF_INET 또는 PF_INET6 소켓 (SOCK_RAW)에서만 사용 가능합니다.

커널이 IP 헤더를 추가하려면, PF_INET 소켓을 사용해야합니다.

1

대신 다음과 같이 수행 할 수 있습니다

int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); 

그것은 소켓 IP_HDRINCL이라는 세트 원시 소켓 것을 의미한다. getsockopt을 사용하여 소켓 값을 확인하면 IP_HDRINCL이 이미 설정되어있는 것을 볼 수 있습니다.

관련 문제