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

标签 c++ c sockets protocols packets

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

相关文章:

c - 尝试从文件描述符读取事件时选择 block

java - 如何在Java客户端服务器程序中从控制台获取输入

c++ - 为什么我们不直接使用 Object 文件?

c++ - 为什么实例化数组比 glDrawElement 慢?

c - 当我溢出分配的字符数组时,为什么我的 C 程序不会崩溃?

python - 如何将 FANN 保存为字符串?

c# - 套接字错误 : An existing connection was forcibly closed by the remote host

c++ - 错误 C2664 : 'errno_t strcpy_s(char *,rsize_t,const char *)' : cannot convert parameter 2 from 'char [512]' to 'rsize_t'

c++ - 在 temp.deduct.partial 中,为什么参数包不够专业?

c - 将变量映射到 C 中的特定地址