2012-04-11 127 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. 在邮件的开头附加一些固定大小的邮件字段