이것은 내 코드입니다. 컴파일하는 동안 오류가 발생하지 않습니다. 내가 그것을 실행할 때, 그것은 오류에서원시 소켓이 생성되지 않는 이유는 무엇입니까?
에 수신 된을 제공, 패킷
오류를 가져 오지 못했습니다. 뭐가 잘못 되었 니?
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;
}
errno를 확인하여 단서를 제공하는지 확인하십시오. – John3136
Errno 107은 소켓이 연결되어 있지 않음을 의미합니다 (더 이상 사용하지 않음). 이것이 일어날 수있는 몇 가지 이유가 있습니다. 당신이 옳다고 가정하고 연결의 양쪽에서 소켓이 여전히 열려 있다고 주장하면 중간 라우터/스위치가 시간 초과로 인해 연결을 끊을 수 있습니다. 이러한 일이 발생하지 않도록하는 가장 안전한 방법은 주기적으로 '건강'또는 '연결 유지'메시지를 보내는 것입니다. 하지만 어떻게해야합니까? – divinediu
대신 원시 TCP 소켓을 사용하는 이유가 있습니까? 아니면 일반 SOCK_STREAM입니까? TCP에는 모든 패킷이 전송/수신되고 전송 된 순서대로 수신되는지 확인하기위한 많은 것들이 내장되어 있습니다. 원시 소켓을 사용하면 Windows 크기, 전송, 3 방향 핸드 셰이크, 연결 재설정을 모두 직접 추적해야합니다. 물론 실제 IP 및 TCP 헤더를 파싱하고 생성합니다. 여기서 문제는 3 방향 핸드 셰이크를 처리하지 않아 연결이 제대로 연결되지 않는다는 것입니다. –