2014-10-02 31 views
0

我通過套接字發送字節並且工作正常。現在就傳輸文件而言,我需要在發送實際數據之前發送文件大小。所以我想出了一個想法,即在文件數據之前發送文件大小作爲標題。C Socket,在數據流之前添加標頭

例如,如果文件數據是"1234",那麼套接字將在"1234"之前發送其長度爲4的字節(它是4),並且將有8個字節通過套接字發送。前4個字節包含數據長度,其餘字節爲實際數據。

我可以轉換由INT成字節(即字符數組):

bytes[0] = (n >> 24) & 0xFF; 
bytes[1] = (n >> 16) & 0xFF; 
bytes[2] = (n >> 8) & 0xFF; 
bytes[3] = n & 0xFF; 

問題是前的實際數據,我不能添加此4個字節:

char *data = [Actual data of file]; 
char *buffer = malloc(4 + strlen(data)); 
strcpy(buffer, bytes); 
strcat(buffer, data); 

這樣的結果是bytes[]消失了,bufferdata

有完全相同的數據任何人都可以幫助我嗎?

回答

1

您不需要在數據緩衝區中添加長度字節。使用單獨的緩衝區。那麼你可以在send()的長度緩衝區之前爲你的數據緩衝區設置send()。更好的是,您可以將數據長度存儲在32位的intuint32_t中,使用htonl()以網絡字節順序排列字節,然後直接將send()複製到自己的緩衝區中。這變得更容易,如果你包裝在一個函數您發送邏輯來管理,如:

void sendData(void *data, uint32_t datalen) 
{ 
    uint32_t len = htonl(datalen); 
    send(socket, &len, sizeof(len), 0); 
    send(socket, data, datalen, 0); 
} 

char *data = [Actual data of file]; 
uint32_t datalen = [Actual length of file]; 

sendData(data, datalen); 
1

好吧,我假設你知道你在做什麼與數據,並且它是一個nul終止的字符串,並且你不想發送終止符(因爲你不分配空間給它在你的緩衝區中)。你想可以做什麼如下:

size_t len = strlen(data); 
char *buffer = malloc(4 + len); 
memcpy(buffer, bytes, 4); 
memcpy(buffer + 4, data, len); 

請注意,您的字節是不是一個字符串,因此你不想使用字符串函數像strcpystrcat他們。 memcpy(dst, src, len)只是從srcdst正好複製len字節,而不關心實際內容,如nul終止符。

+0

是的,我認爲memcpy的可以工作。謝謝。你是什​​麼意思的終止字符串?我認爲終止符已經在'data'字符串的最後一個字符處了。 – SnowWolf 2014-10-02 03:48:09

+0

C字符串的最後一個字符是最終字符''\ 0''(或者只是'0')。但是,這不是字符串本身的一部分:''hello''是'{'h','e','l','l','o','\ 0'}'。請注意,即使'strlen(「hello」)'爲5,該字符串也由6個字符組成。 – misberner 2014-10-02 06:02:40