odczyt danych z tcp

0

Witam, mam problem z odczytaniem danych z pakietu tcp:

typedef struct tcp_hdr
{
   unsigned short int sport;
   unsigned short int dport;
   unsigned int seqnum;
   unsigned int acknum;
   unsigned short int DataOffset;
   unsigned char  Flags;
   unsigned short int Reserved;
   unsigned short int Urg;
   unsigned short int Ack;
}TCP_HDR  ;

if(WSAStartup(MAKEWORD(2,1),&wsd) != 0) return;
sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);

char FAR name[MAX_HOSTNAME_LAN];
gethostname(name, MAX_HOSTNAME_LAN);

struct hostent FAR * pHostent;
pHostent = (struct hostent * )new char[(sizeof(struct hostent))];
pHostent = gethostbyname(name);

SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(6000);

memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);

bind(sock, (SOCKADDR *)&sa, sizeof(sa));

WSAIoctl(sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL);

while( true )
    {
    //memset(RecvBuf, 0, BufferLen) ;
    recv(sock, RecvBuf, BufferLen, 0) ;
    ip_hdr  *pIpheader = (ip_hdr *)RecvBuf;
    tcp_hdr *pTcpheader = (tcp_hdr *)(RecvBuf + sizeof(ip_hdr));
    udp_hdr *pUdpheader = (udp_hdr *)(RecvBuf + sizeof(ip_hdr))
    }

I teraz jak z tej struktury odczytac dane pakietu, umiem odczytac ip i porty ale nie umiem odczytac danych.

0

Bawiłem się tym i nadal rozłącza niechciane strony :)
Po pierwsze musisz cały pakiet odebrać naraz (musisz mieć bufor 64kB bo max pakiet może mieć 65535 bajtów)

Po odebraniu paczki sprawdzasz czy są dane. recv() zwraca ich ilość. Jeśli <40 to return.
wielkość nagłówka IP = (iphdr.ip_hl & 15) *4 // może się zwiększać, ale minimum 40 bajtów
badasz jaki jest protokół w iphdr.ip_protocol:

jeśli to IPPROTO_TCP to następne bajty po ip.hdr to tcp header, a po nim dane. Podobnie z resztą protokołów

http://people.freenet.de/sapero/tcpip.pdf <- ciekawy opis nagłówków, choć skąpy

0

Witam

Ale ja to juz robie tz, mam oadresy ip nadawcy i odbiorcy i ich porty teraz tylko chce odczytac ostatni 32b element pakieta a mianowicie dane jakie niesie. Jak to zrobic ???

0

Informacja jaka mi jest potrzebna to na ktorym bicie zaczynaja sie dane jakie niesie pakiet, jak bede mial to to bede mial wszystko nie rozumiem zapisu data offset, jak ktos moze to wytlumaczyc to bede wdzieczny.

0

Witam serdecznie

Informacja jaka mi jest potrzebna to na ktorym bicie zaczynaja sie dane jakie niesie pakiet

Pierwszy bit danych ma index = offset * 32 (przy numerowaniu od 0)
(Data offset to ilość 32-bitowych słów z jakich składa się nagłówek)

pozdrawiam

0

Thx kapustka ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1