从套接字读取原始数据

时间:2012-04-11 13:34:10

标签: delphi sockets

我有一台设备通过gprs将数据发送到我的服务器。问题是它发送原始数据,我不知道在哪里可以停止阅读

目前我正在使用TIdHttpServer和类似的内容来阅读字符串:

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

我的问题有更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

TCP是面向流的。如果协议未知,则服务器只能尝试读入字节数组(如果内存不是问题)或文件流。如果客户端正常断开连接,则数据已完成“#39;”。不幸的是,如果协议未知,服务器无法告诉客户端是否正常死机或断开连接。

InputBufferIsEmpty没有帮助,因为它只说(如果)(TCP)缓冲区中有数据 - 并且根据延迟,这可能经常发生,但这并不意味着没有更多的飞行中字节。

您可以尝试反向工程'协议,通过客户端设备发送已知字符串。但如果发件人是一个黑盒子,可能会有很多特殊情况 - 想想编码或逃避'人物等。

答案 1 :(得分:0)

你可以自己制定协议。

有些想法是:

  1. 使用特殊字符或字符组合来定义结尾 信息。
  2. 在邮件的开头附加一些具有邮件大小的固定大小字段