2012-04-13 189 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 */ 
{ 


    ... 
} 
相關問題