0

C プログラムで /tmp/mypipe に作成されたパイプがあります。パイプは、プログラム内の 2 つのモジュールでコマンド バイトを送受信するために使用されます。モジュールは、以下の構造で指定されたデータを送信します。

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として受信されることです.Googleで見つけた複数の提案を試しました. しかし、データをパイプにリダイレクトしようとすると失敗します。

どんな助けでも大歓迎です。

4

2 に答える 2

4

ほとんどの場合、リトル エンディアン マシンを使用しているため、数値はリトル エンディアンで表示する必要があります。

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 では、ホストのバイト順は Least Significant Byte first ですが、ネットワークのバイト順は、インターネットで使用されているように、Most Significant Byte first です。

于 2013-04-11T09:11:36.793 に答える