2012-04-13 120 views
1

如果我发送纯文本,则没有问题。一切都好。 但是,如果我尝试从C#客户端发送图像,服务器会收到正确的字节数,但是当我将缓冲区保存到文件(以二进制模式 - wb)时,它总是有4个字节。将图像从C#客户端发送到C服务器

我通过使用函数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; 
} 

回答

1

你的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 ; 
} 
+0

为什么我不能使用'strlen(buf)'而不是? – deem 2012-04-13 14:38:12

+1

因为'strlen()'是用于字符串的,只会计数到第一个''\ 0'' – 2012-04-13 14:39:12

1

你做使用sizeof(buf)的初学者的错误。它不会返回缓冲区中的字节数,而是返回指针的大小(根据运行32位还是64位平台,其大小为4或8)。

您需要将ReceiveMessage函数更改为“返回”接收数据的大小。

+0

为什么我不能使用'strlen(buf)'而不是? – deem 2012-04-13 14:38:20

+1

@daroPL你可以,但只有当接收到的数据实际上是一个正确的字符串。如果它是一个图像,它包含的二进制数据可以包含一个值为'0'的字节,该值用作字符串终止符。 – 2012-04-13 14:40:20

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


    ... 
} 
相关问题