将映像从 C# 客户端发送到 C 服务器
本文关键字:服务器 客户端 映像 | 更新日期: 2023-09-27 18:30:56
如果我发送纯文本,没有问题。一切都还好。但是,如果我尝试从 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;
}
你的 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(buf)
犯了一个初学者错误。它不返回缓冲区中的字节数,而是返回指针的大小(根据您运行的是 32 位还是 64 位平台,指针的大小为 4 或 8)。
您需要更改ReceiveMessage
函数以"返回"接收数据的大小。
你不会得到数组的大小 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 */
{
...
}