1

プレーンテキストを送信しても問題ありません。全て大丈夫。ただし、C# クライアントから画像を送信しようとすると、サーバーは正しいバイト数を受け取りますが、バッファーをファイルに保存すると (バイナリ モード - wb)、常に 4 バイトになります。

関数を使用して C# クライアントで送信しますFile.ReadAllBytes()

私の保存コードは次のようになります

   FILE * pFile;
   char *buf = ReceiveMessage(s);
   pFile = fopen (fileName , "wb");
   fwrite(buf, sizeof(buf[0]), sizeof(buf)/sizeof(buf[0]), pFile);
   fclose (pFile);
   free(buf);

私の受信機能は次のようになります

static unsigned char *ReceiveMessage(int s)
{
   int prefix;
   recv(s, &prefix, 4, 0);
   int len = prefix;
   char *buffer= (char*)malloc(len + 1);
   int received = 0, totalReceived = 0;
   buffer[len] = '\0';
   while (totalReceived < len)
   {
      if (len - totalReceived > BUFFER_SIZE)
      {
         received = recv(s, buffer + totalReceived, BUFFER_SIZE, 0);
      }
      else
      {
         received = recv(s, buffer + totalReceived, len - totalReceived, 0);
      }
      totalReceived += received;
   }

   return buffer;
}
4

3 に答える 3

1

を使用する初心者の間違いを犯しsizeof(buf)ます。バッファー内のバイト数ではなく、ポインターのサイズ (32 ビットまたは 64 ビットのプラットフォームを実行しているかどうかに応じて 4 または 8) を返します。

ReceiveMessage受信したデータのサイズも「返す」ように関数を変更する必要があります。

于 2012-04-13T14:35:42.873 に答える
1

C コードlenは ReceiveMessage() 関数から戻す必要があります。

char *buf = ReceiveMessage(s);  // buf is a char*
... sizeof(buff)                // sizeof(char*) is 4 or 8

したがって、次のようなものが必要になります

 static unsigned char *ReceiveMessage(int s, int* lenOut)
 {
     ...
     *lenOut = totalReceived ;
 }
于 2012-04-13T14:35:49.657 に答える
1

では配列のサイズを取得できませんsizeof。次のように変更します。

int len = 0;
char *buf;

buf = ReceiveMessage(s, &len);

/* then use len to calculate write length */


static unsigned char *ReceiveMessage(int s, int *len) 
/* or return len and pass ptr to buf */
{


  ...
}
于 2012-04-13T14:42:29.437 に答える