その構造内の任意のアライメントブロックを導入していない、あなたのコンパイラが、あるとして、あなただけの、あなたのコードに含めることができるはずです(CHAR_BIT
は8とsizeof(struct ipheader)
が20であることを確認してください)、その後のような何かを追加提供:
そのコードで
struct ipheader *iph = (struct ipheader *)blk;
printf ("TTL = %d\n", iph->ip_ttl);
、あなたはおそらくchar*
あるblk
によって指さIPヘッダを、持っています。正しいポインタタイプにキャストすると、フィールドに簡単にアクセスできます。
次の完全なプログラムは、この動作を示している:予想通り
#include <stdio.h>
#include <limits.h>
struct ipheader {
/* 0 */ unsigned char ip_hl:4, ip_v:4;
/* 1 */ unsigned char ip_tos;
/* 2 */ unsigned short int ip_len;
/* 3 */ unsigned short int ip_id;
/* 4 */ unsigned short int ip_off;
/* 5 */ unsigned char ip_ttl;
/* 6 */ unsigned char ip_p;
/* 7 */ unsigned short int ip_sum;
/* 8 */ unsigned int ip_src;
/* 9 */ unsigned int ip_dst;
};
int main (void) {
char blk[] = {
'\x00','\x11','\x22','\x22','\x33','\x33','\x44','\x44',
'\x55','\x66','\x77','\x77','\x88','\x88','\x88','\x88',
'\x99','\x99','\x99','\x99'
};
struct ipheader *iph = (struct ipheader *)(&blk);
printf ("TTL = %x\n", iph->ip_ttl);
printf ("sum = %x\n", iph->ip_sum);
printf ("dst = %x\n", iph->ip_dst);
return 0;
}
出力される。これらの値の
TTL = 55
sum = 7777
dst = 99999999
あなたはどのようにすでに利用可能なパケットからフィールドを解析するために不思議に思っている、またはどのように最初にヘッダを含むパケットを捕捉することを場所? –
[libpcap](http://www.tcpdump.org/)を見てみることをお勧めします。あなたの人生を楽にするはずです。 –
クエリは、シンプルなデータグラムパケット(UDP)を作成している間に、SrcIPとポート、DEst IPアドレスとポートを作成してパケットを送信し、残りの値がデフォルトでシステムstack.so私は残りのフィールドの値を知りたいと思う:例えば、ttl、tos等 – sumant