같은 것을 사용하는 것을 비교하면 다음과 같은 기능을 가지고 :
이것은 TCP 페이로드는 항상 시작 후 20 바이트를 시작한다는 가정을하고있다
static int handle_tcp(const struct tcphdr *tcp, int len)
{
char buf[PCAP_SNAPLEN];
memcpy(buf, tcp + 1, len - sizeof(*tcp));
DEBUG("DANY TCPDs tcp string: %s",buf);
if (0 == handle_http(buf, len - sizeof(*tcp)))
return 0;
return 1;
}
TCP 헤더 (항상 20이므로 sizeof(*tcp) == 20
). 이것은 어떤 TCP 옵션도 고려하지 않습니다. 매우 일반적인 TCP 옵션을 사용하여 패킷을 수신하는 경우 handle_http()
은 버퍼의 시작 부분에 바이너리 인코딩 된 TCP 옵션을 표시합니다. 이는 사용자가보고있는 것일 수 있습니다. 대신이 같은
시도 뭔가 :
static int handle_tcp(const struct tcphdr *tcp, int len)
{
char buf[PCAP_SNAPLEN];
memcpy(buf, (void*)tcp + tcp->doff*4, len - tcp->doff*4);
DEBUG("DANY TCPDs tcp string: %s",buf);
if (0 == handle_http(buf, len - tcp->doff*4))
return 0;
return 1;
}
또는 더 나은 아직, 난 당신이 지속적으로 버퍼의 사본 수십 당신은 기회가있을 때마다 제작하는 이유를 모르겠어요. 뭔가 빠뜨리지 않으면 포인터를 넘길 수 있습니다.
static int handle_tcp(const struct tcphdr *tcp, int len) {
return handle_http((void*)tcp + tcp->doff*4, len - tcp->doff*4);
}
트래픽은 http/ssl 트래픽입니까? –
순수한 http, no ssl – cenos