Хорошо, похоже, что вы фактически меняете части IP-пакета на основе диаграммы. Эта диаграмма основана на 32-битных словах, причем каждый бит показан как маленькие «тики» вдоль горизонтальной линейки, смотрящей вверху. Байты показаны как большие «тики» на верхней линейке.
Итак, если вы должны были прочитать первый байт файла, младший полубайт (четыре байта младшего разряда) содержит версию, а полубайт высокого порядка содержит число 32-битных слов в header (предполагая, что мы можем интерпретировать это как заголовок IP).
Итак, с вашей диаграммы вы можете видеть, что исходный адрес находится в четвертом слове, поэтому, чтобы прочитать это, вы можете переместить точку файла в эту точку и прочитать в четырех байтах. Таким образом, в псевдо-код, который вы должны быть в состоянии сделать это:
fp = fopen("the file name")
fseek(fp, 12) // advance the file pointer 12 bytes
fread(buf, 1, 4, fp) // read in four bytes from the file.
Теперь вы должны иметь адрес источника в BUF.
OK, чтобы сделать это немного более конкретным, вот пакет я захватил с моей домашней сети:
0000 00 15 ff 2e 93 78 bc 5f f4 fc e0 b6 08 00 45 00 .....x._......E.
0010 00 28 18 c7 40 00 80 06 00 00 c0 a8 01 05 5e 1f .([email protected]^.
0020 1d 9a fd d3 00 50 bd 72 7e e9 cf 19 6a 19 50 10 .....P.r~...j.P.
0030 41 10 3d 81 00 00 A.=...
Первые 14 байт являетесь EthernetII заголовок, первые шесть байтов (00 15 ff 2e 93 78)
, являющихся местом MAC-адрес, следующие шесть байтов (bc 5f f4 fc e0 b6)
является исходным MAC-адресом, а два новых байта (08 00)
означают, что следующий заголовок имеет тип IP.
Следующие двадцать байт в IP-заголовке (который вы показываете в вашей фигуре), эти байты:
0000 45 00 00 28 18 c7 40 00 80 06 00 00 c0 a8 01 05 E..([email protected]
0010 5e 1f 1d 9a ^...
Так истолковывать это позволяет смотреть на 4-байтовые словах.
Первый 4-байтовое слово (45 00 00 28)
, в соответствии с вашей фигуры:
first byte : version & length, we have 0x45 meaning IPv4, and 5 4-byte words in length
second byte : Type of Service 0x00
3rd & 4th bytes: total length 0x00 0x28 or 40 bytes.
Второй 4-байтовое слово (18 c7 40 00)
, в соответствии с вашей фигуры:
1st & 2nd bytes: identification 0x18 0xc7
3rd & 4th bytes: flags (3-bits) & fragmentation offset (13-bits)
flags - 0x02 0x40 is 0100 0000 in binary, and taking the first three bits 010 gives us 0x02 for the flags.
offset - 0x00
Третий 4- байтное слово (80 06 00 00)
, согласно вашему рисунку:
first byte : TTL, 0x80 or 128 hops
second byte : protocol 0x06 or TCP
3rd & 4th bytes: 0x00 0x00
Четвертого 4-байтовое слово (c0 a8 01 05)
, в соответствии с вашей фигурой:
1st to 4th bytes: source address, in this case 192.168.1.5
notice that each byte corresponds to one of the octets in the IP address.
Пятым 4-байтовое слово (5e 1f 1d 9a)
, в соответствии с вашими фигурами:
1st to 4th bytes: destination address, in this case 94.31.29.154
Выполнением этого типа программирования является сначала сбив с толку, я рекомендую сделать пару раз (например, я сделал выше) несколько раз, чтобы повесить его.
В этой строке кода printf("%02x", (unsigned int)buf[i]);
я бы рекомендовал изменить его на printf("%02x ", (unsigned char)buf[i]);
. Помните, что каждый элемент в вас buf массив представляет собой один байт, считанный из файла.
Надеется, что это помогает, Т.
ЬиХ не определенно. – stark
Хе-хе, этот код работает, я его не поместил. Код работает так, как должен, я просто не знаю, куда идти оттуда –
Итак, вы знаете порядок байтов двоичного формата и порядок байтов вашей платформы (пожалуйста, подтвердите, являются ли они одинаковыми или разными) , а buf - массив unsigned char? Мы не любим играть здесь «Великий Крескин». См. Http://stackoverflow.com/help/mcve - (нам нужен компилируемый пример). – JohnH