3

このサーバーコードで私の疑問の例を見てみましょう:

/* some code */
void *filebuffer = NULL;
/* some other code */

for (size_to_send = fsize; size_to_send > 0; ){
  rc = sendfile(f_sockd, fd, &offset, size_to_send);
  if (rc <= 0){
    perror("sendfile");
    onexit(f_sockd, m_sockd, fd, 3);
  }
  size_to_send -= rc;
}

/* その他のコード */

およびこのクライアント コード:

/* some code */
void *filebuffer;
/*some other code */
for(size_to_receive = fsize; size_to_receive > 0;){
  nread = read(f_sockd, filebuffer, size_to_receive);
  if(nread < 0){
    perror("read error on retr");
    onexit(f_sockd, 0, 0, 1);
  }
  if(write(fd, filebuffer, nread) != nread){
    perror("write error on retr");
    onexit(f_sockd, 0, 0, 1);
  }
  size_to_receive -= nread;
}
/* other code */

私の質問は、サーバーが x86 マシン (リトル エンディアン) にあり、クライアントが x64 マシン (リトル エンディアン) にある場合、ポインタのサイズ (4 ~ 8 バイト) が異なると問題が発生する可能性がありますか?
はいの場合、どうすれば解決できますか?

4

1 に答える 1

3

いいえ、実際にはソケットを介してポインターを送信するのではなく、バイトのストリームのみを送信するため、問題にはなりません。私が見る唯一の問題は、ファイルがバイナリ データであり、その中に 64 ビット整数があり、受信プラットフォームが 64 ビット整数をサポートしていない 32 ビットである場合です (例: long long)。組み込みシステム。

PS。受信ループでは、読み取りエラーをチェックしますが、ソケットがもう一方の端で閉じられているかどうかはチェックしません (read返されるとき0)。

于 2012-09-03T06:07:47.647 に答える