Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Разбор TCP header


Автор: Kappac 17.2.2008, 22:45
Доброго времени суток! 
Получаю пакет с помощью pcap, разбор ethernet и ip заголовков проходит нормально, но при попытке определить порты источника\приемника в tcp\udp возвращаются абсолютно не раельные числа. Как правильно представить номера портов?
P.S. Мои исходники прилагаются.

Автор: jonie 18.2.2008, 23:44
несмотря исходники используете internet формат чисел, конечно же ?

Автор: Kappac 19.2.2008, 12:26
И с преобразованием и без, результаты в любом случае не правильные.   smile 

Автор: jonie 19.2.2008, 21:12
значит не оттуда брешешь ...
несилен в никсах: а как там насчет выравнивания полей в структурах ?

Автор: Kappac 20.2.2008, 15:49
Дело не в никсах, RFC-то везде RFC, вот потому и код положил... 

Автор: jonie 21.2.2008, 11:05
rfc пишется с расчетом align=1byte, а у тя в структурах как ?...

Автор: Kappac 25.2.2008, 14:15
У меня в структурах с учетом BigEndian и LittleEndian памяти, но к портам это значение не имеет, так как их номера хранятся в 2 байтах(short).

Автор: jonie 25.2.2008, 19:27
а я грю про выравнивание, а не про формат слов.
Код


//
// c этим должно дать 14      21      20
//а вот без такого трюка даст (у меня например) такое : 14      24      20
#pragma pack(1)    

#include "protocols.h"

int main(int argc, _TCHAR* argv[]){
    cout<<sizeof(protocol_ether_h)<<"\t"<<sizeof(protocol_ipv4_h)<<"\t"<<sizeof(protocol_tcp_h);
    return 0;
}

Автор: turist 25.2.2008, 19:30
Код

if(strcmp(prType->p_name, "tcp") == 0)
        getTcp((u8 *)packet, ip->ihl);
if(strcmp(prType->p_name, "udp") == 0)
        getUdp((u8 *)packet, ip->ihl);


Вот в этом месте вы передаёте не IP пакет, а Ethernet. Надо было:
getTcp((u8 *)packet+ETH_HLEN, ip->ihl)

из linux/if_ether.h:
#define ETH_HLEN 14

Автор: Kappac 26.2.2008, 14:32
jonie, turist, спасибо, вечером проверю и отпишусь! 

Автор: fish9370 26.2.2008, 17:31
http://www.tcpdump.org/pcap.htm

Код

/* ethernet headers are always exactly 14 bytes */
#define SIZE_ETHERNET 14

    const struct sniff_ethernet *ethernet; /* The ethernet header */
    const struct sniff_ip *ip; /* The IP header */
    const struct sniff_tcp *tcp; /* The TCP header */
    const char *payload; /* Packet payload */

    u_int size_ip;
    u_int size_tcp;

ethernet = (struct sniff_ethernet*)(packet);
    ip = (struct sniff_ip*)(packet + SIZE_ETHERNET);
    size_ip = IP_HL(ip)*4;
    if (size_ip < 20) {
        printf("   * Invalid IP header length: %u bytes\n", size_ip);
        return;
    }
    tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip);
    size_tcp = TH_OFF(tcp)*4;
    if (size_tcp < 20) {
        printf("   * Invalid TCP header length: %u bytes\n", size_tcp);
        return;
    }
    payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_tcp);

Автор: Kappac 26.2.2008, 17:59
fish9370, отдельное спасибо, за хороший пример! 

Автор: Kappac 27.2.2008, 10:59
turist, fish9370, спасибо за наводку! Действительно не правильно переходил по указателю! 
Тема закрыта! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)