The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"помогите пересчитать TCP checksum"
Отправлено tcp, 27-Сен-06 15:20 
>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)

спасибо, на счёт выравнивания всё поправил

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру