2016-08-26 9 views
0

ビットトレントdhtにデータを格納するために少しのビットトレントクライアントを構築しようとしています。 ビットトレント機能の多くは必要ではないので、私は可能な限りシンプルなままにしようとしています。これは、限られた数の使用例で機能する必要があるためです。6バイトのIP /ポート文字列をcのin_addr構造体に構文解析します

私はブートストラップノードから取得したメッセージから新しいノードに関する情報を解析しようとしています。各ノードの情報は26バイトです。 20バイトはノードID、4バイトのIPアドレス、2バイトのポート番号です。すべての情報はバイナリ形式です。 IPアドレスとポート番号を、IPのin_addrパラメータとポートのunsinged shortを持つstruct(myNode)に格納します。

typedef struct myNode { 
    unsigned char id[21]; 
    struct in_addr ip; 
    unsigned short port; 
} myNode; 

IDの解析がうまく機能します。しかし、IPとポートの解析は失敗します。時にはそれは動作しますが、大部分は同時に動作しないし、同時に動作することもありません。私はビットシフトに何か問題があるかもしれないと思っていますが、私は何が分からないのですか?私はパース後進でIPをprintfのとき、私は主にこのような何かを得る:

0xffffed3a

だから、働いていないシフトに最初のように思えます。他のビットは正しいです。私は間違って何をしていますか?

int get_nodes_from_find_node(char *msg, myNode *setme) { 
    char *fnstr = "nodes"; 
    char *pos, *ptr; 
    long lenNodes; 
    int nrNodes, i = 0, k = 0; 

    pos = strstr(msg, fnstr);   // Find nodes section. 
    if(pos == NULL) { return -1; } 
    pos += strlen(fnstr); 

    lenNodes = strtoul(pos, &ptr, 10); // Save the length of the nodes section in lenNodes 
    nrNodes = lenNodes/26;   // Get number of nodes, about which info is delivered. 
    pos = ptr+1;      // Set pos to first node. 

    while(nrNodes > 0) { 
    for(k=0;k<20;k++,pos++) {  // First 20 bytes are ID. 
     setme[i].id[k] = *pos; 
    } 
    setme[i].id[20] = '\0';   // Make ID a Null-terminated string. 

    setme[i].ip.s_addr = (*pos << 24) | (*(pos+1) << 16) | (*(pos+2) << 8) | *(pos+3); // Next 4 bytes are IP in network byte order. 
    pos += 4; 

    setme[i].port = (*pos << 8) | *(pos+1); // Last 2 bytes are port. 
    pos += 2; 

    nrNodes--; 
    i++; 
    }  
    return 0; 
} 
+0

申し訳ありませんがわかりません。 4バイトに整列しないとどういう意味ですか? – redleo85

答えて

0

問題は(*pos << 24) | (*(pos+1) << 16) | (*(pos+2) << 8) | *(pos+3)です。

pos[0,...,3]のいずれかの値が負の場合、式全体が負になります。

+0

それは理にかなっています。どうすれば修正できますか? – redleo85

+0

ありがとうございます。すべてのビットに演算子を追加しなければならなかった。今はちょっと混乱しているようですが、仕事はしています。 :-)((* pos << 24)&0xff000000)| ((*(pos + 1)<< 16)&0x00ff0000)| ((*(pos + 2)<< 8)&0x0000ff00)| (*(pos + 3)&0x000000ff); – redleo85

+0

@ redleo85:はい、基本的には、用語のそれぞれをORの前に「符号なし」にキャストする必要があります。 –

関連する問題