我有一臺服務器,多數民衆贊成發出的數據記錄爲不同長度的字符串(如79,80,81,82)同步
我希望能夠獲得一個記錄我一直用(r)分隔記錄,但是因爲我不知道我必須接收多少字節,它有時會合並記錄並使我難以處理。
我有一臺服務器,多數民衆贊成發出的數據記錄爲不同長度的字符串(如79,80,81,82)同步
我希望能夠獲得一個記錄我一直用(r)分隔記錄,但是因爲我不知道我必須接收多少字節,它有時會合並記錄並使我難以處理。
我對你有兩個想法:
編輯: 看看在(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個節點「打開」。
您應該使用空字節進行分隔。向我們顯示您的代碼,我們可能會幫助您。
除非....您確實要發送ascii(0).... – elcuco 2010-09-07 05:20:51
它是最少使用的字符,因爲許多應用程序使用它來分隔或終止數據段。 – 2010-09-07 05:35:40
流套接字本質上不支持「記錄」的概念 - 它們提供的抽象是連續流的抽象。
您必須在其上實施一個圖層以提供「記錄」。這聽起來像你已經在那裏的一部分,與記錄結束分隔符。僞代碼來完成它:
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;
}
}
不能我這樣做沒有XML?我可以自己解析標題吧? – aks 2010-09-07 04:35:09
我認爲這將工作。感謝 – aks 2010-09-07 04:37:05
無法保證'read()'會完全讀取您所要求的內容。你必須循環,直到你得到完整的數據包大小,如果你這樣做,那麼你也可以循環尋找數據包的分隔符。 – caf 2010-09-07 05:36:02