0

我在 C 程序中的 /tmp/mypipe 处创建了一个管道。管道用于通过程序中的两个模块发送和接收命令字节。模块按照以下结构发送数据:

struct controller
{
  int command;
  char data[100];
}

我想以相同的格式将数据发送到 /tmp/mypipe。我尝试了以下命令,C 程序接收到数据。

echo -e "\x00\x00\x00\x04"www.google.com > /tmp/mypipe

但是,程序接收到的数据格式如下:

control.command = 67108864
control.data = www.google.com

我想要的是仅将 control.command 作为第 4 号接收。我尝试了通过谷歌找到的多个建议。但是,当我尝试将数据重定向到管道时,它会失败。

任何帮助将不胜感激。

4

2 回答 2

4

您很可能使用的是 little endian 机器,因此您应该以 little endian 显示数字

echo -e "\x04\x00\x00\x00"www.google.com > /tmp/mypipe

或者,最好在接口的合同中选择一个字节序,并确保在代码中将其转换为机器的字节序

NAME
htonl, htons, ntohl, ntohs - convert values between host and network byte order  

SYNOPSIS
#include <netinet/in.h>

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

描述

htonl() 函数将无符号整数 hostlong 从主机字节顺序转换为网络字节顺序。

htons() 函数将无符号短整数 hostshort 从主机字节顺序转换为网络字节顺序。

ntohl() 函数将无符号整数 netlong 从网络字节顺序转换为主机字节顺序。

ntohs() 函数将无符号短整数 netshort 从网络字节顺序转换为主机字节顺序。

在 i80x86 上,主机字节顺序是最低有效字节在前,而在 Internet 上使用的网络字节顺序是最高有效字节在前。

于 2013-04-11T09:11:36.793 回答
1

这是一个大/小端问题。

在您的系统上,您应该使用:

echo -e "\x04\x00\x00\x00"www.google.com > /tmp/mypipe
于 2013-04-11T09:08:58.667 回答