0

TCP ソケットを介して数値の配列を送信しようとしていますが、正しくありません。正しい数値を受信して​​いない理由がわかりません。これが私が持っているものです...

クライアント

// the number array to be sent
unsigned long numArray[10] = { htonl(1), htonl(2), htonl(3), htonl(4), htonl(5), 
                               htonl(6), htonl(7), htonl(8), htonl(9), htonl(10) };
send(s, &numArray[0], sizeof(numArray), 0);

サーバ

// get the array of numbers
unsigned long numberArray[10];
int numberData = recv(new_fd, numberArray, sizeof(numberArray), 0);
if(numberData == -1) {
  cout << "ERROR" << endl;
}
unsigned long* num = numberArray;
for(int i = 0; i < sizeOfIncomingData; i++) {
  // this outputs a bunch of huge numbers, none of which are right...
  cout << ntohl(*(num+i)) << endl;
}
4

3 に答える 3

3

最初にいくつかのことを行います。

1) の戻り値send()またはrecv()不完全な読み取りまたは書き込みのいずれかをチェックしていません。指定した実際のバイト数を送受信しない可能性があり、実際に送受信された数の値を返します。

2)long接続の両側で同じサイズであるとは限りません。通常は 32 ビットまたは 64 ビットです。これは常に 32 ビットであり、送信/受信配列もその型を使用してアーキテクチャに依存しないようにする必要がありますhtonluint32_t

于 2012-10-19T07:22:59.403 に答える
0

これらの数値を 16 進数に変換すると、次のようになります。

10 0A 40 00
06 00 00 00
40 10 40 00
0A 15 60 00
10 0A 40 00
28 60 A3 4F
C0 11 60 00

これらはあなたの数字ではなく、ある種のデータ ストリームです。 10は DLE、0Aは改行、40"@" です。後のデータもあなたの数字ではありません。

TCP はこのようなデータを挿入しません。送信ソケットに他に何も書き込まれていないこと、および正しい受信ソケットから読み取っていることを確認する必要があります。

于 2012-10-19T16:12:53.617 に答える
0

私の問題は、送信された以前のデータに起因していたことが判明しました。送信されるサイズと受信されるサイズが異なるため、配列全体がめちゃくちゃになりました。皆さん、アドバイスありがとうございます。こんなに早く気がつかなかったなんて信じられません...

于 2012-10-22T00:31:39.017 に答える