1

次のようなパケットを作成する必要がある場合:

field 1: SOCKS protocol version, 1 byte 
field 2: status, 1 byte: 
field 3: reserved, must be 0x00
field 4: address type, 1 byte: 
field 5: destination address of 
         1 byte of name length followed by the name for Domain name
field 6: network byte order port number, 2 bytes

char packet[6];   
packet[0] = 5;   
packet[1] = 0;   
packet[2] = 0;  
packet[3] = 1;   
packet[4] = /* ... ???? ... */;
packet[5] = 80;`

packet[4]の(フィールド 5)はどのように書きwww.google.comますか? 前もって感謝します。

4

2 に答える 2

2

確かに、6 バイト以上が必要です。簡単なオプションの 1 つは、次を使用することstd::vectorです。

std::vector<unsigned char> v;
v.push_back(5);
v.push_back(0);
v.push_back(0);
v.push_back(1);

std::string address = "www.google.com";
v.push_back(address.size());
std::copy(address.begin(), address.end(), std::back_inserter(v));

v.push_back(80);

// data is accessible as an array by using &v[0]
于 2011-02-01T01:17:25.977 に答える
1

必要なものを取得するために、各フィールドをパケット配列の特定の固定インデックスとして持つことはできません。各位置は最大 1 バイトしか保持できないためです。次のようにする必要があります。

char address[] = "www.google.com";
int addressLen = strlen(address);
char* packet = (char *) malloc(sizeof(char)*6+addressLen);
int i;

packet[0] = 5;
...
packet[3] = 1;
packet[4] = addressLen;

for (i = 0; i < addressLen; i++) 
   packet[i + 5] = address[i];

packet[4 + addressLen] = 80;

編集: 実際、この例は C 用に作成しました。C++ でも動作するはずですが、使用しているネットワーク ライブラリのインターフェイスがわかりません。その malloc は、おそらく新しいものに置き換えることができます。または、配列としてもアクセスできると思うので、標準のコンテナを使用することもできます。

于 2011-02-01T01:20:46.773 に答える