Indy 10 IdTCPSever Readbytes加扰数据

迈克·希尔

我试图在Delphi 2007中使用Indy10 ReadBytes()读取一系列格式为[#bytes] \ r \ n的数据段的大量下载,其中#bytes表示字节数。我的算法是:

  1. 使用ReadBytes()获取[#] \ r \ n文本,通常为10个字节。
  2. 使用ReadBytes()获取指定的#个数据字节。
  3. 如果需要处理更多数据段,即#为负,请转到步骤1。

这很好用,但通常在第1步中我没有得到期望的文本。这是在330个成功的数据段之后的一个简短示例:

从最后一步2 ReadBytes()接收到的数据。注意嵌入步骤1 [-08019] \ r \ n文本。

Line|A033164|B033164|C033164|D033164|E033164|F033164|G033164|H033164|EndL\r|Begin 
Line|A033165|B033165|C033165|D033165|E033165|F033165|G033165|H033165|EndL\r|Begin 
Line|A033166|B033166|C033166|D033166|E033166|F033166|G033166|H033166|EndL\r[-08019]

\ r \ n |开始线| A033167 | B033167 | C033167 | D033167 | E033167 | F033167 | G033167 | H033167 | EndL \ r |开始线| A033168 | B033168 | C033168 | D033168 | E033168 | F033168 | G033168 | H033168 | EndL \ r |开始

WireShark捕获的套接字数据。

0090 30 33 33 31 36 36 7c 42 30 33 33 31 36 36 7c 43 033166|B033166|C
00a0 30 33 33 31 36 36 7c 44 30 33 33 31 36 36 7c 45 033166|D033166|E
00b0 30 33 33 31 36 36 7c 46 30 33 33 31 36 36 7c 47 033166|F033166|G
00c0 30 33 33 31 36 36 7c 48 30 33 33 31 36 36 7c 45 033166|H033166|E
00d0 6e 64 4c 0d ndL.

编号时间源目标协议长度信息

2837 4.386336000 000.00.247.121 000.00.172.17 TCP 1514 40887 > 57006 [ACK] Seq=2689776 Ack=93 Win=1460 Len=1460
Frame 2837: 1514 bytes on wire (12112 bits), 1514 bytes captured (12112 bits) on interface 0
Ethernet II, Src: Cisco_60:4d:bf (e4:d3:f1:60:4d:bf), Dst: Dell_2a:78:29 (f0:4d:a2:2a:78:29)
Internet Protocol Version 4, Src: 000.00.247.121 (000.00.247.121), Dst: 000.00.172.17 (000.00.172.17)
Transmission Control Protocol, Src Port: 40887 (40887), Dst Port: 57006 (57006), Seq: 2689776, Ack: 93, Len: 1460
Data (1460 bytes)

0000 5b 2d 30 38 30 31 39 5d 0d 0a 7c 42 65 67 69 6e [-08019]..|Begin
0010 20 4c 69 6e 65 7c 41 30 33 33 31 36 37 7c 42 30 Line|A033167|B0
0020 33 33 31 36 37 7c 43 30 33 33 31 36 37 7c 44 30 33167|C033167|D0
0030 33 33 31 36 37 7c 45 30 33 33 31 36 37 7c 46 30 33167|E033167|F0

有谁知道为什么会这样吗?谢谢

更多信息。我们从单个线程进行套接字读取,并且在读取时不调用Connected()。以下是相关的代码段:

AClientDebugSocketContext.Connection.Socket.ReadBytes(inBuffer,byteCount,True);
numBytes := Length(inBuffer);
Logger.WriteToLogFile(BytesToString: '+BytesToString(inBuffer,0,numBytes),0);
Move(inBuffer[0], Pointer(Integer(Buffer))^, numBytes);
雷米·勒博(Remy Lebeau)

如您所描述的嵌入式数据,尤其是在随机时间,通常发生在您同时从多个线程中的同一套接字读取数据时,它们之间没有足够的同步。一个线程可能会接收一部分传入的数据,而另一个线程可能会接收另一部分数据,并且最终导致它们InputBuffer以错误的顺序存储数据由于您没有提供任何代码,因此很难确定您的问题是否存在。最好的选择是确保您永远不会从同一线程中读取多个线程。这包括对的任何调用Connected(),因为它在内部执行读取操作。您应该在一个线程中完成所有阅读。如果这不是一个选择,则至少用某种线程间锁(例如临界区或互斥锁)包装套接字I / O。

更新:您正在TIdContext通过自己的AClientDebugSocketContext变量访问对象该代码在哪里正确使用?如果不是在服务器的的背景下OnConnectOnDisconnectOnExecute,或OnException事件,那么你是从多个线程在同一插座读书,因为TIdTCPServer在内部调用Connected()(它的读取)在调用之间OnExecute该事件的TIdContext对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Indy 10 HTTPS 代理

来自分类Dev

Indy10,IdTCPClient的IOHandler发送其他数据

来自分类Dev

Indy10 GMTToLocalDateTime问题

来自分类Dev

Indy 10 SSL根证书

来自分类Dev

Delphi 7 Indy 10 ioHandler

来自分类Dev

Indy10 GMTToLocalDateTime问题

来自分类Dev

使用Delphi 2007和Indy TIdHTTP v10从流中获取x字节的数据

来自分类Dev

我尝试发送数据到FTP时发生INDY10流写入错误

来自分类Dev

Delphi Indy 10 HTTPServer将数据库实例绑定到会话

来自分类Dev

Delphi 2007和更新的Indy 10

来自分类Dev

Indy 10 TidTCPServer编码字符

来自分类Dev

Indy 10的IdSSLIOHandlerSocketOpenSSL使Delphi 5崩溃

来自分类Dev

Indy 10和sslvTLSv1_2

来自分类Dev

Delphi:从Indy9到Indy10的迁移:使用IdCustomHTTPServer和IdHTTPServer

来自分类Dev

什么与Indy10中的GStack.HostToNetwork()对应

来自分类Dev

在Indy 10中是否可以使用IMAP GetLineResponse?

来自分类Dev

Indy 10-IdSMTP.Connect引发“无法加载SSL库”。

来自分类Dev

Indy 10无法安装到Delphi 5中

来自分类Dev

Delphi / w Indy 10:错误400(idHTTP)之后获取内容

来自分类Dev

如何重建Delphi XE2随附的Indy 10?

来自分类Dev

在Indy 10中是否可以使用IMAP GetLineResponse?

来自分类Dev

使用tcp indy10进行实时音频流

来自分类Dev

如何使用Indy10 TIdIcmpClient跟踪路由?

来自分类Dev

Indy 10服务器:如何发送JSON响应?

来自分类Dev

Indy10>如何在WriteLn()调用之后等待

来自分类Dev

带Indy 10的Delphi-TCP通讯的最佳方法

来自分类Dev

Delphi 2007 Indy 10找不到SSL库

来自分类Dev

Indy 10分段上传到OneDrive错误

来自分类Dev

URL不返回数据Delphi Indy TIdHttp