>struct cksum {
> struct pseudo_hdr pseudo;
> struct tcp_hdr tcp;
>};
>здесь:
>struct tcp_hdr tcp;
>это tcp заголовок, судя по названию. А должен быть весь TCP-пакет (заголовок
>и данные).
>об этом написано в rfc (азбука для сетевого программирования).
>http://www.faqs.org/rfcs/rfc793.html эм...
сделал так
payload = (u_char *)(packet + size_ethernet + size_ip + size_tcp);
struct cksum {
struct pseudo_hdr pseudo;
struct tcp_hdr tcp;
u_char *payload;
};
функция подсчёта
inline u_short tcp_sum(u_short *addr, int len)
{
register int nleft = len;
register u_short *w = addr;
register int sum = 0;
u_short answer = 0;
/* Our algorithm is simple, using a 32 bit accumulator (sum), we add
* sequential 16 bit words to it, and at the end, fold back all the
* carry bits from the top 16 bits into the lower 16 bits. */
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
/* mop up an odd byte, if necessary */
if (nleft == 1) {
*(u_char *)(&answer) = *(u_char *) w;
sum += answer;
}
/* add back carry outs from top 16 bits to low 16 bits */
sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
sum += (sum >> 16); /* add carry */
answer = ~sum; /* truncate to 16 bits */
return(answer);
}
но всё равно не правильно :(
>сделать обязательно для тех стуктур что накладываются на сырые данные (из сокета
>или из файла). по умолчанию размер структуры не равен сумме размеров
>членов структуры т.к. используется выравнивание (в разных системах по разному).
>
>struct aaa1
>{
>int mmm;
>char bbb;
>} a1;
>
>#pragma pack(push,1)
>struct aaa2
>{
>int mmm;
>char bbb;
>} a2;
>#pragma pack(pop)
>
>sizeof(a1) != sizeof(a2)
спасибо, на счёт выравнивания всё поправил