|
Свой стек TCP/IP |
|
|
|
Oct 24 2008, 07:47
|
Тутэйшы
   
Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263

|
Типичный заголовок Код void Create_IP_Header(unsigned char *ip_header, unsigned char protocol, unsigned int total_len, unsigned int id, unsigned long src_addr, unsigned long dst_addr) { *((unsigned char*)ip_header + IP_HDR_VER_LEN) = 0x45; //Version + IHL *((unsigned char*)ip_header + IP_HDR_TOS) = 0x00; //ToS *(unsigned int*)(unsigned char*)((unsigned char*)ip_header + IP_HDR_TOTAL_LEN) = __reverse(total_len); //Total Lenghth *(unsigned int*)(unsigned char*)((unsigned char*)ip_header + IP_HDR_ID) = __reverse(id); //Identification *((unsigned char*)ip_header + (IP_HDR_FLAG_FRGT_OFFSET + 0)) = 0x40; //Flags + Fragment Offset. MF = 0, DF = 1 *((unsigned char*)ip_header + (IP_HDR_FLAG_FRGT_OFFSET + 1)) = 0x00; //Fragment Offset *((unsigned char*)ip_header + IP_HDR_TTL) = 0x80; //TTL *((unsigned char*)ip_header + IP_HDR_PROTOCOL) = protocol; //Protocol *(unsigned int*)(unsigned char*)((unsigned char*)ip_header + IP_HDR_CHECKSUM) = 0; //IP Checksum *(unsigned long*)(unsigned char*)((unsigned char*)ip_header + IP_HDR_SRC_ADDR) = __reverse(src_addr); //SRC IP ADDR *(unsigned long*)(unsigned char*)((unsigned char*)ip_header + IP_HDR_DST_ADDR) = __reverse(dst_addr); //DST IP ADDR }
|
|
|
|
|
Oct 24 2008, 08:12
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Спасибо. To vesago: А это из исходников linux или чего другого? Вы можите выложить исходников побольше, например (__reverse(total_len)  , конечно если это не комерческая инфа. Я например думаю сделать IP заголовок через union, навскидку например так: Код tupdef union{ uint8 raw_data[2000]; //--------------------------------- struct{ uint8 ip_header; uint8 tos; …… }IP; //-------------------------------- struct{ uint8 shift[32]; //пропускаем IP заголовок uint16 PORT_surce; uint16 PORT_distenation; …… }TCP; //---------------------------------- struct{ uint8 shift[32]; //пропускаем IP заголовок …… }UDP; }IP_FRAME; Тогда обращения будут выглядеть так: IP_FRAME ip_frame; Ip_frame.IP. header=0x45; Ip_frame.TCP. PORT_surce =0x0080; Ну и т.д. Как вам такой подход? Какие есть замечания?
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Oct 27 2008, 11:09
|
Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 27-11-07
Из: Пермь
Пользователь №: 32 732

|
Вы конечно рановато замахнулись на TCP. Начните хотябы с UDP - во много раз проще будет начать. Цитата(Beginning @ Oct 24 2008, 13:12)  uint16 PORT_distenation; Destination
|
|
|
|
|
Oct 28 2008, 05:15
|
Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 27-11-07
Из: Пермь
Пользователь №: 32 732

|
TCP простой, немного сложнее UDP. Проблема в том, что его отлаживать надо намного дольше чем UDP (только сравните заголовки TCP и UDP!). Да, с CRC бывает больше всего проблем.  Так что советую найти где-нибудь калькулятор, который бы считал CRC, а Вы бы сранивали его с тем, что выдает ваша функция.
|
|
|
|
|
Oct 28 2008, 08:14
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Всё проблема решена. PING отправляется и приходит. Вот пример:
Вот что я посылаю : --> GSM:FF,3,0,21,45,0,0,1C,0,0,40,0,FF,1,BD,F0,A,14,B7,8F,40,E9,BB,63,8,0,F7,FE,0,1 ,0,0,22,E6,
И вот что приходит : <-- GSM:FF,3,0,21,45,0,0,1C,0,0,40,0,EC,1,D0,F0,40,E9,BB,63,A,14,B7,8F,0,0,FF,FE,0,1 ,0,0,B1,32,
IP - 40.E9.BB.63 - это google IP - A,14,B7,8F - адрес который мне сеть выдала
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Oct 29 2008, 11:12
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(Beginning @ Oct 29 2008, 14:18)  Скачал LwIP. Думаю выдрать от туда TCP. Кто работал с этим, какие мнения? может єто поможет, сам по нему разбираюсь
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 29 2008, 11:25
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Встречал я подобные схемы, и ещё сложнее. Там столько нюансов. Один расчёт окна чего стоит. Вообще можно написать. Но писать километр времени надо. Лично я нелюблю чужие исходники брать, т.к. на их изучение тратится примерно столько же времени, сколько и на написание своих. Но видимо не в этом случае.  Ни у кого нету uCOS TCP/IP. Хочется глянуть что за весч. А то на их сайте надо километровую анкету заполнять, а у меня хроническая аллергия к подобным анкетам. To west329_: A вы уже написали PPP(Ethernet),IP? Вы сейчас TCP пишите?
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Oct 29 2008, 12:04
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(Beginning @ Oct 29 2008, 15:25)  Встречал я подобные схемы, и ещё сложнее. Там столько нюансов. Один расчёт окна чего стоит. Вообще можно написать. Но писать километр времени надо. Лично я нелюблю чужие исходники брать, т.к. на их изучение тратится примерно столько же времени, сколько и на написание своих. Но видимо не в этом случае.  Ни у кого нету uCOS TCP/IP. Хочется глянуть что за весч. А то на их сайте надо километровую анкету заполнять, а у меня хроническая аллергия к подобным анкетам. To west329_: A вы уже написали PPP(Ethernet),IP? Вы сейчас TCP пишите? дошол до TCP и в стопор, уж больно сложная реализация, но говорят можно простую сотворить, если используются небольшие пакеты данных, чтоб не разбивать и собирать их потом. пока ищу..
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|