1

int64_tUDPで2つ送信したいです。これを行うには、それらを 4 要素の配列に格納します。

  • [0] - 最初の 32 を下げるint64_t
  • [1] - 最初の上位 32 ビットint64_t
  • [2] - 秒の下位 32 ビットint64_t
  • [3] - 秒の場合は上位 32 ビットint64_t

送信するための私のコード:

int64_t from, to;

/* some logic here */

data[0] = htonl((int32_t) from);
data[1] = htonl((int32_t) (from >> 32));
data[2] = htonl((int32_t) to);
data[3] = htonl((int32_t) (to >> 32));

/* sending via UDP here */

UDP経由で受信int32_tした後に結合するための私のコード:int64_tdata

int64_t from, to;
from = (int64_t) ntohl(data[1]);
from = (from << 32);
from = from | (int64_t) ntohl(data[0]);
to = (int64_t) ntohl(data[3]);
to = (to << 32);
to = from | (int64_t) ntohl(data[2]);

printf("received from = %" PRId64 "\n", from);
printf("received to = %" PRId64 "\n", to);

最初の数字 ( from) は常に正しいです。しかし、2番目から得たものprintfは正しくありません。さらに、それは最初の数に依存しているようです。例:

送信:

  • from= 125,
  • to= 20。

受け取った:

  • from= 125,
  • to= 125。

送信:

  • from= 1252、
  • to= 20。

受け取った:

  • from= 1252、
  • to= 1268。

私は何を間違っていますか?変換またはネットワーク経由での送信の問題ですか?

4

2 に答える 2

6

レシーバー コードにタイプミスがあります。

to = from | (int64_t) ntohl(data[2]);

する必要があります

to = to | (int64_t) ntohl(data[2]);
于 2013-06-11T10:44:43.627 に答える
2

64 ビット値を逆方向に送信していることに注意してください。htonl()int32 が正しい順序で送信されるようにしますが、RFC 1700では、フィールドの最上位オクテットが最初に送信されると定義されています。

マルチオクテット量が送信される場合、最も重要なオクテットが最初に送信されます。

于 2013-06-11T10:55:49.137 に答える