将图像从C#客户端发送到C服务器

将图像从C#客户端发送到C服务器,c#,c,sockets,C#,C,Sockets,如果我发送纯文本,没有问题。一切都好。 但是,如果我尝试从C#client发送一个映像,服务器会收到正确的字节数,但是当我将缓冲区保存到文件(以二进制模式-wb)时,它总是有4个字节 我使用函数File.ReadAllBytes()通过C#客户端发送它 我的保存代码看起来像 FILE * pFile; char *buf = ReceiveMessage(s); pFile = fopen (fileName , "wb"); fwrite(buf, sizeof(buf

如果我发送纯文本,没有问题。一切都好。 但是,如果我尝试从C#client发送一个映像,服务器会收到正确的字节数,但是当我将缓冲区保存到文件(以二进制模式-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;
}
我的接收函数看起来像

   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;
}
static unsigned char*ReceiveMessage(int-s)
{
int前缀;
recv(s和前缀,4,0);
int len=前缀;
char*buffer=(char*)malloc(len+1);
接收的int=0,接收的totalReceived=0;
缓冲区[len]='\0';
while(总接收缓冲区大小)
{
接收=recv(s,缓冲区+接收总数,缓冲区大小,0);
}
其他的
{
received=recv(s,缓冲区+totalReceived,len-totalReceived,0);
}
totalReceived+=已接收;
}
返回缓冲区;
}

您犯了一个初学者错误,使用了
sizeof(buf)
。它不返回缓冲区中的字节数,而是返回指针的大小(根据您运行的是32位还是64位平台,指针的大小是四还是八)


您需要更改
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
获得数组的大小。更改为,即:

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


  ...
}

为什么我不能使用
strlen(buf)
而不是?因为
strlen()
是用于字符串的,并且只计算到第一个
'\0'
为什么我不能使用
strlen(buf)
而不是?@daroPL可以,但前提是接收的数据实际上是正确的字符串。如果是图像,则它包含二进制数据,其中可以包含一个值为
0
的字节,该字节用作字符串终止符。