Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 9

Как правильно посчитать Checksum для tcp hdr?

13.12.2014, 20:19. Показов 1436. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
raw сокеты, принимаю пакет, меняю порт назначения, порт источника, пересчитываю чек сумму, отсылаю, но wireshark пишет:
Checksum: 0xe26e [incorrect, should be 0xe268 (maybe caused by "TCP checksum offload"?)]
Не подскажите в чем может быть проблема?
вот алгоритм пересчета чек суммы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
unsigned short csum(unsigned short *ptr,int nbytes) {
    register long sum;
    unsigned short oddbyte;
    register short answer;
 
    sum=0;
    while(nbytes>1) {
        sum+=*ptr++;
        nbytes-=2;
    }
    if(nbytes==1) {
        oddbyte=0;
        *((u_char*)&oddbyte)=*(u_char*)ptr;
        sum+=oddbyte;
    }
 
    sum = (sum>>16)+(sum & 0xffff);
    sum = sum + (sum>>16);
    answer=(short)~sum;
     
    return(answer);
}
/*принимаю пакет, меняю порты, отсылаю*/
struct pseudo_header    //needed for checksum calculation
    {
    unsigned int source_address;
    unsigned int dest_address;
    unsigned char placeholder;
    unsigned char protocol;
    unsigned short tcp_length;
     
    struct tcphdr tcp;
    } psh;
    struct sockaddr_in sin;
    memset((void *)&sin, 0, sizeof(struct sockaddr_in));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = inet_addr("192.168.1.6"); // ip for send
    sin.sin_port = 0;
    struct iphdr *ip_ = (struct iphdr*)(send_1_queue.front() + ETH_HLEN);
    struct tcphdr *tcp = (struct tcphdr*)((char*)ip_ + sizeof(struct iphdr));
    ip_->daddr = inet_addr("192.168.1.6") ;
    tcp->source = htons(9999);
    tcp->dest = htons(8888);
    /*пересчет чек-суммы tcp hdr*/
    tcp->check = 0;
    psh.source_address = ip_->saddr;
    psh.dest_address = sin.sin_addr.s_addr;
    psh.placeholder = 0;
    psh.protocol = ip_->protocol;
    psh.tcp_length = htons(sizeof(struct tcphdr));
    memcpy(&psh.tcp , tcp , sizeof (struct tcphdr));
    tcp->check = csum( (unsigned short*) &psh , sizeof (struct pseudo_header));
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.12.2014, 20:19
Ответы с готовыми решениями:

Как правильно принять изображение JPG и записать в файл TCP
Я с TCP клиента андроид передаю на сервер файл JPEG.Данные вроде отправляются нормально, но на сервере при приеме возникают проблемы. Вот...

Подскажите как правильно передать данные в javascript из TCP Server C#
Форумчане, потратил уйму времени но так и не нашел решение для своего вопроса. У меня есть TCP using System; using System.Text;...

Как правильно принять данные по TCP протоколу функцией recv?
Всем добрый вечер! Пытаюсь реализовать получение данных с устройства через TCP. linux OS. Данные принимаются. Только не всегда...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.12.2014, 20:19
Помогаю со студенческими работами здесь

Как правильно отключить TCP соединение чтобы сервер не спамил пустыми сообщениями
Всем добра. Помогите с задачей. Всё пытаюсь сделать чат на Unity Есть сервер, он работает. Подключает и отключает клиентов. ...

Как посчитать 0.7 + 0.35 правильно?
Здравствуйте! Плз, не кидайтесь помидорами - я читал FAQ и не нашёл ответа. Ввожу код: >>>0.75 + 0.35 получаю странное...

Как правильно посчитать в mathcad
привет! помогите, пожалуйста с этой "не ерундой"! с программой маткад только ознакомилась, но подружится не получается. понимаю, что надо...

Как правильно посчитать остатки?
Как правильно посчитать остатки номенклатуры? 7.7 бухгалтерия или комплексная ! Я Пытался сделать через Дебитовое и кредитовое вычитание по...

Как правильно посчитать вероятность события?
Пытаюсь рассчитать вероятность выигрыша в одной лотерейке. Но не знаю, как это делать правильно. Для упрощения понимания - попытаюсь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru