【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21015

UDPチェックサムの計算
投稿者---samsara(2005/05/12 10:58:54)


UDPプロトコルでのチェックサムを計算するプログラムを
作成しています。作成したけれど計算結果が合わず困って
おります。どこが悪いのかがわかっておりません。
ご指摘していただけたら幸いです。

OS・・・・・・・VineLinux3.1
コンパイラ・・・GNU gcc

引数1 udp・・・UDPのヘッダ・データの先頭アドレス
引数2 len・・・UDPのヘッダ・データのBYTE数
引数3 ip・・・IPヘッダの先頭アドレス
戻り値・・・・・チェックサム値

unsigned short UdpCheckSum( unsigned char* udp, unsigned short len, unsigned char* ip )
{
    unsigned char header[12];//擬似ヘッダ
    unsigned char* ptr;
    unsigned int val, sum, i;

    //IPヘッダを元に擬似ヘッダ作成
    memcpy( &(header[0]), ip+12, 4 );                  //送信元IPアドレスコピー
    memcpy( &(header[4]), ip+16, 4 );                  //宛先IPアドレスコピー
    header[8] = 0;                      //ZERO
    header[9] = 0x11;                              //プロトコル(UDP)
    header[10] = (unsigned char)( ( len >> 8 ) & 0x00FF );  //UDP長
    header[11] = (unsigned char)( len & 0x00FF );         //UDP長

    //擬似ヘッダ分のチェックサム
    sum = 0;
    i = 0;
    while( i < 12 )
    {
        val = ( header[i] << 8 ) + header[i+1];
        sum = sum + val;
        i = i + 2;
    }
    //UDP分のチェックサム
    ptr = udp;
    while( ptr < (udp + len) )
    {
        if( ptr == udp+len-1 )
        {
            val =  (*ptr) << 8;
        }
        else
        {
            val = ( *ptr << 8 ) + *(ptr+1);
        }
        sum = sum + val;
        ptr = ptr + 2;
    }
    //補正
    sum = ( sum >> 16 ) + ( sum & 0x0000FFFF );
    if( sum > 0x0000FFFF )
    {
        sum = ( sum >> 16 ) + ( sum & 0x0000FFFF );
    }
    return( (unsigned short)sum );
}


MACヘッダ・IPヘッダ・UDPヘッダ・UDPデータを作成して
パケットを送信したところ、EtherRealでモニタしましたが、
UDPのチェックサムとIPのチェックサムにIncorectと表示され、
チェックサム値が不正ということのようです。
とりあえずはUDPのチェックサム値の計算方法を確認中です。

よろしくお願い致します。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:UDPチェックサムの計算 21033 samsara 2005/05/13 15:59:39


No.21033

Re:UDPチェックサムの計算
投稿者---samsara(2005/05/13 15:59:39)


解決できました。参考に作成した関数を載せておきます。

unsigned short UdpCheckSum( unsigned char* udp, unsigned short len, unsigned char* ip )
{
    unsigned char header[12];//擬似ヘッダ
    unsigned char* ptr;
    unsigned int val, sum, i;

    //擬似ヘッダ作成
    memcpy( &(header[0]), ip+12, 4 );                  //送信元IPアドレスコピー
    memcpy( &(header[4]), ip+16, 4 );                  //宛先IPアドレスコピー
    header[8] = 0;                      //ZERO
    header[9] = 0x11;                              //プロトコル
    header[10] = (unsigned char)( ( len >> 8 ) & 0x00FF );  //UDP長
    header[11] = (unsigned char)( len & 0x00FF );         //UDP長

    //擬似ヘッダ分のチェックサム
    sum = 0;
    i = 0;
    while( i < 12 )
    {
        val = ( header[i] << 8 ) + header[i+1];
        sum = sum + val;
        i = i + 2;
    }
    //UDP分のチェックサム
    ptr = udp;
    while( ptr < (udp + len) )
    {
        if( ptr == udp+len-1 )
        {
            val =  (*ptr) << 8;
        }
        else
        {
            val = ( *ptr << 8 ) + *(ptr+1);
        }
        sum = sum + val;
        ptr = ptr + 2;
    }
    //補正
    sum = ( sum >> 16 ) + ( sum & 0x0000FFFF );
    if( sum > 0x0000FFFF )
    {
        sum = ( sum >> 16 ) + ( sum & 0x0000FFFF );
    }
    //反転
    sum = ~sum & 0x0000FFFF;
    if( sum == 0x00000000 )
    {
        sum = 0x0000FFFF;
    }
    return( (unsigned short)sum );
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧