我知道我的数据包是什么样子。它有 6 个 header 字段(每个 header 字段 1 个字节,每个 header 有 8 个字段),然后它有有效负载(数据)。
我想用 C 或 C++ 构建一个原始数据包(我认为它看起来应该是一样的)。
这是我认为我应该做的:
unsigned char packet[11];
packet[0] = (0x81); // first header with 8 fields
packet[1] = (0x8c); // second header with 8 fields
packet[2] = (0xfe);
packet[3] = (0x84);
packet[4] = (0x1d);
packet[5] = (0x79);
packet[6] = (0x96); // payload, the 'h' letter, masked
packet[7] = (0xe1); // 'e'
packet[8] = (0x71); // 'l'
packet[9] = (0x15); // 'l'
packet[10] = (0x91);// 'o'
例如,0x81
是第一个字节(我只是将第一个 header 的每个字段(位)转换为十六进制)。
然后,简单地说,我想将其发送到服务器:send(sockfd, packet, sizeof(packet), 0)
来发送它。
接收并打印响应:
unsigned char buffer[1024];
if ((recv(sockfd, buffer, len, 0)) == 0)
{
if (errno != 0)
{
exit(1);
}
}
int i;
for(i = 0; i<len; i++)
printf("%x ", buffer[i]);
我说得对吗?
最佳答案
除了错误处理 recv
的返回值之外,您的代码看起来还不错。
if ((recv(sockfd, buffer, len, 0)) == 0)
{
if (errno != 0)
{
exit(1);
}
}
归零表示连接正常关闭。如果 errno
返回零,则没有理由检查它。
返回值-1
表示错误。在这种情况下,检查 errno 确实有意义。
大于零的值表示已接收到的字节数。请注意,recv
返回的字节数少于您要求的字节数是完全正常的。如果您想准确接收一定数量的字节,则必须在循环中调用 recv
。
TCP 是一种字节流协议(protocol),不知道您的“数据包”(实际上是消息)在哪里开始和结束。
关于c++ - 在 C/C++ 中创建和发送原始数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43803543/