1

私は C\C++ でネットワーク プログラミングを行っていますが、割り当てで書式設定されたメッセージを送信するよう求められています。

形式は次のとおりです。

bits:    0.....15 16....31  
          update#  port#           
             Sever-IP

あなたが最初の行を見たように、私に尋ねてください:

  1. int を 16 ビットに変換して、2 つの int が 32 ビットになるようにします。

  2. xxx.xxx.xxx.xxx を 32 ビットに変換します。

私はUDPを使用しているので、これらの情報を char[] に入れる必要があります。これが難しい部分です。私のプログラムでは、update# と port # を int として、サーバーの IP アドレスを string として持っています。どうすればこれらのビットに変換できますか?

これが私が試したことです:

  1. それらをcharにキャストします。しかし、1 つの int を 2 つの char に変換する必要があります。

  2. それらを文字列に変換してからstring.c_str()に変換しますが、4バイトのポインターが得られます。

4

2 に答える 2

2

これを行う最も簡単な方法は、次のようにヘッダーの構造体を作成することです。

#pragma pack(push,1)

struct header
{
    unsigned short updateNumber;
    unsigned short port;
    unsigned long ip;
};
#pragma pack(pop)

そして、次のように使用します。

char *buffer = new char[sizeof(header)+sizeOfRemainingMessage];
header *head = (header*)buffer;
head->update = 1;
head->port = 80;
head->ip = // convert ip string to unsigned long*
send(buffer); 

*ip 文字列を unsigned long に変換するには、inet_addr()を参照してください。

于 2012-04-26T02:09:14.227 に答える
0

C++ の int または long int は 4 バイト (32 ビット) ですが、実装によって異なります。sizeof 演算子を使用して型のサイズを確認します。

次に、シフト演算子を使用して、更新値とポート値を次々に入れることができます。

文字列についても基本的には同じです。文字列を 4 つのセグメントに分割し、それぞれを整数に変換し、各セグメントを long int 内で適切な量だけシフトする必要があります。

于 2012-04-26T00:28:16.320 に答える