同步

2010-09-07 79 views
3

我有一臺服務器,多數民衆贊成發出的數據記錄爲不同長度的字符串(如79,80,81,82)同步

我希望能夠獲得一個記錄我一直用(r)分隔記錄,但是因爲我不知道我必須接收多少字節,它有時會合並記錄並使我難以處理。

回答

4

我對你有兩個想法:

  1. 使用XML的協議。這樣您就可以確切知道每條消息何時結束。
  2. 在每個「數據包」的頭部發送數據包大小,這樣您就知道從這個特定數據包的套接字中讀取多少數據。

編輯: 看看在(2)

int buffer_size; 
char* buffer; 

read(socket, &buffer_size, sizeof(buffer_size)); 
buffer = (char*) malloc(packet_size); 
read(socket, buffer, buffer_size); 
// do something 
free(buffer) ; 

編輯這個虛擬代碼: 這裏我推薦看評論,因爲他們注意到,contect可能不是通過簡單的「準備就緒read()「,你需要保持」read()「,直到你得到正確的緩衝區大小。

此外 - 您可能不需要閱讀大小。基本上你需要尋找XML的結束頂級標籤。這可以通過解析整個XML來完成,或者解析從流中獲得的XML,直到您有0個節點「打開」。

+0

不能我這樣做沒有XML?我可以自己解析標題吧? – aks 2010-09-07 04:35:09

+0

我認爲這將工作。感謝 – aks 2010-09-07 04:37:05

+1

無法保證'read()'會完全讀取您所要求的內容。你必須循環,直到你得到完整的數據包大小,如果你這樣做,那麼你也可以循環尋找數據包的分隔符。 – caf 2010-09-07 05:36:02

0

您是否以流的形式發送數據?

您可以將它作爲一個更易於解析和檢索數據的結構發送。

struct Message 
{ 
    int dataSize; 
    char data[256]; 
}; 
+0

no..It必須是甲流,由於一些其他方面的限制 – aks 2010-09-07 04:33:40

+0

請扭轉結構 - 在實踐中,數據尺寸將首先發送。我知道這不會改變它的工作原理,但在語義上它更清晰。 – elcuco 2010-09-07 04:34:52

+0

@elcuco - 感謝您的提示。因此編輯:) – bdhar 2010-09-07 04:42:20

0

您應該使用空字節進行分隔。向我們顯示您的代碼,我們可能會幫助您。

+0

除非....您確實要發送ascii(0).... – elcuco 2010-09-07 05:20:51

+0

它是最少使用的字符,因爲許多應用程序使用它來分隔或終止數據段。 – 2010-09-07 05:35:40

0

流套接字本質上不支持「記錄」的概念 - 它們提供的抽象是連續流的抽象。

您必須在其上實施一個圖層以提供「記錄」。這聽起來像你已經在那裏的一部分,與記錄結束分隔符。僞代碼來完成它:

create empty buffer; 
forever { 
    recv data and append to buffer; 

    while (buffer contains end-of-record marker) { 
     remove first record from buffer and process it; 
     move remaining data to beginning of buffer; 
    } 
}