2012-02-03 5 views
0

이것은 내 코드입니다. 컴파일하는 동안 오류가 발생하지 않습니다. 내가 그것을 실행할 때, 그것은 오류에서원시 소켓이 생성되지 않는 이유는 무엇입니까?

에 수신 된을 제공, 패킷

오류를 가져 오지 못했습니다. 뭐가 잘못 되었 니?

sock_raw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 

일반적으로 원시 소켓은 UNIX 또는 Linux에서 루트 사용자에 대해 작동합니다

logfile=fopen("log.txt","w"); 
if(logfile==NULL) printf("Unable to create file."); 
printf("Starting...\n"); 
//Create a raw socket that shall sniff 
sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_TCP); 

if(sock_raw < 0) 
{ 
    printf("Socket Error\n"); 
    return 1; 
} 
while(1) 
{ 
    saddr_size = sizeof saddr; 
    //Receive a packet 
    data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , &saddr_size); 
    if(data_size <0) 
    { 
     printf("Recv from error , failed to get packets\n"); 
     return 1; 
    } 
    //Now process the packet 
    ProcessPacket(buffer , data_size); 
} 
close(sock_raw); 
printf("Finished"); 
return 0; 

}

+0

errno를 확인하여 단서를 제공하는지 확인하십시오. – John3136

+0

Errno 107은 소켓이 연결되어 있지 않음을 의미합니다 (더 이상 사용하지 않음). 이것이 일어날 수있는 몇 가지 이유가 있습니다. 당신이 옳다고 가정하고 연결의 양쪽에서 소켓이 여전히 열려 있다고 주장하면 중간 라우터/스위치가 시간 초과로 인해 연결을 끊을 수 있습니다. 이러한 일이 발생하지 않도록하는 가장 안전한 방법은 주기적으로 '건강'또는 '연결 유지'메시지를 보내는 것입니다. 하지만 어떻게해야합니까? – divinediu

+0

대신 원시 TCP 소켓을 사용하는 이유가 있습니까? 아니면 일반 SOCK_STREAM입니까? TCP에는 모든 패킷이 전송/수신되고 전송 된 순서대로 수신되는지 확인하기위한 많은 것들이 내장되어 있습니다. 원시 소켓을 사용하면 Windows 크기, 전송, 3 방향 핸드 셰이크, 연결 재설정을 모두 직접 추적해야합니다. 물론 실제 IP 및 TCP 헤더를 파싱하고 생성합니다. 여기서 문제는 3 방향 핸드 셰이크를 처리하지 않아 연결이 제대로 연결되지 않는다는 것입니다. –

답변

0

당신이 원하는 경우는 다음과 같은 사용, 모든 이더넷 트래픽을 도청.

일부 오래된 Windows는 원시 소켓을 전혀 허용하지 않습니다. saddr

유형은 다음과 같아야합니다 u는 실행 파일을 실행할 때

struct sockaddr_ll 
2

그냥 ./executablefilename 전에 sudo는 명령을 사용합니다. 같은 : $ gcc가 pack.c -o 팩 다음 $ sudo를가 ./pack 다음이 실행됩니다 잘 감사

-1

나는 과거에 그 문제가 발생했습니다. RAW 소켓을 만들려면 관리자 권한으로 실행 파일을 실행해야합니다.

관련 문제