[英]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.