gpt4 book ai didi

c++ - 在 C/C++ 中创建和发送原始数据包

转载 作者:行者123 更新时间:2023-11-30 20:21:06 25 4
gpt4 key购买 nike

我知道我的数据包是什么样子。它有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com