簡體   English   中英

將圖像從C#客戶端發送到C服務器

[英]Sending an image from a C# client to a C server

如果我發送純文本沒有問題。 一切都好。 但是,如果我嘗試從C#客戶端發送一個映像,服務器會收到正確的字節數,但是當我將緩沖區保存到文件(二進制模式 - wb)時,它總是有4個字節。

我通過使用File.ReadAllBytes()函數由C#客戶端發送它。

我的保存代碼看起來像

   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;
}

你初學者犯了使用sizeof(buf)錯誤。 它不返回緩沖區中的字節數,而是返回指針的大小(如果運行32位或64位平台,則為4或8)。

您需要更改ReceiveMessage函數以“返回”接收數據的大小。

您的C代碼需要從ReceiveMessage()函數傳回len

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 ;
 }

你沒有得到sizeof數組的sizeof 改為ie:

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 */
{


  ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM