2012-04-11 155 views
3

我有一個通過gprs向我的服務器發送數據的設備。問題是,它發送的原始數據,我不知道在哪裏可以目前我使用的東西TIdHttpServer和這樣的閱讀串停止閱讀從套接字讀取原始數據

var 
    s : string; 
    repeat 
     s:=s+acontext.Connection.Socket.ReadChar; 
    until acontext.Connection.Socket.InputBufferIsEmpty; 

有沒有更好的解決我的問題?

+1

什麼協議正在發送?設備是否在每個協議單元之後關閉連接? – 2012-04-11 13:38:15

+0

不,它會保留打開的連接來發送命令。是基於TCP/IP的自定義協議 – opc0de 2012-04-11 13:38:57

+0

爲什麼不使用'AContext.Connection.Socket.ReadLn'? – TLama 2012-04-11 13:52:05

回答

3

TCP是面向流的。如果協議未知,服務器只能嘗試讀取字節數組(如果內存不是問題)或文件流。如果客戶端正常斷開連接,則數據是「完整的」。不幸的是,如果協議是未知的,服務器不能告知客戶端是否死亡或正常斷開連接。

InputBufferIsEmpty沒有幫助,因爲它只是說如果在(TCP)緩衝區中有數據 - 並且取決於延遲,這可能會頻繁發生,但這並不意味着沒有更多的空中字節。

您可以嘗試通過在客戶端設備上發送已知字符串來「逆向工程」協議。但是,如果發件人是黑匣子,則可能有許多特殊情況 - 考慮編碼或「轉義」字符等。

0

您可以編寫自己的協議。

一些想法是:

  1. 使用特殊字符或字符組合來定義 消息的結束。
  2. 在郵件的開頭附加一些固定大小的郵件字段