【问题标题】:Arranging bytes in a packet排列数据包中的字节
【发布时间】:2011-02-01 01:08:52
【问题描述】:

如果我需要像这样创建一个数据包:

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;`

如何为www.google.com 编写packet[4](字段5)?提前致谢。

【问题讨论】:

  • 您是否有理由不使用套接字库函数为您执行此操作?手动写数据包很难,但如果你必须手动写,那你就必须手动写。
  • 抱歉,哪些函数会自动执行此操作?
  • 我创建了一个类似于 .NET 框架的BinaryWriter 的类。可以把它想象成一个字符串流,除了它会自动将所有内容分解成一系列字节。

标签: c++ packet socks


【解决方案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]

【讨论】:

  • @Downvoter:这个答案在技术上是不正确的吗?如果有,我很乐意更正答案或将其删除,但如果您首先不发表评论来解释答案有什么问题,我就不可能这样做。
【解决方案2】:

为了获得您想要的,您不能将每个字段作为数据包数组中的特定固定索引,因为每个位置最多只能容纳一个字节。你必须这样做:

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 可能会被一个新的取代。或者您可以使用标准容器,因为我认为它们也可以作为数组访问。

【讨论】:

  • @Revolt:如果我收到这样的数据包,如何从中打印“www.google.com”部分,我尝试使用 for 循环并打印 (char*)&packet[ i + 5] 但它给了我这个:www.g ww.g w.g .g g
  • 要打印收到的数据包中的地址,您首先要读取数据包[4],以了解您必须读取多少字节才能获得地址。然后你需要一个 for (i = 0; i
  • for(int i = 0; i
  • 如果你的 temp 是 char* 类型,你就不需要那个演员表。事实上你不应该使用它。在您的代码中,您想一次打印每个字符,因此您应该打印 temp[i+5] 而不是指向 temp[i+5] 的指针(如果我没记错的话,C++ 将尝试将其打印为字符串而你没有添加'\0')
  • 好的,但是知道,我从客户端(我是服务器)收到这条消息,所以我需要从中获取字符串部分,因为在我需要将类似的数据包发送回客户端之后(你的代码)。但它仍然打印不好,即使我使用 printf("%c", packet[i + 5] 或者如果我使用 cout.
猜你喜欢
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 2011-09-20
  • 1970-01-01
  • 2013-05-01
相关资源
最近更新 更多