在数据包中排列字节

时间:2011-02-01 01:08:52

标签: c++ packet socks

如果我需要创建这样的数据包:

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]撰写www.google.com(字段5)?提前谢谢。

2 个答案:

答案 0 :(得分:2)

当然,你需要六个以上的字节。一个简单的选择是使用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]

答案 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可能会被一个新的替换掉。或者您可以使用标准容器,因为我认为这些容器也可以作为数组访问。