c++builder xe10.3 fmx IdTCPClient 接收问题。

titan_ysl 2018-12-28 06:56:47
我在线程里用IdTCPClient接收图像数据,为了能随时中止接收,用了ReadBytes函数,但是遇到下面的问题,请看代码。

char Buffer[500];
int nBytes;
DynamicArray<Byte> tmp;
tmp.set_length(500);
IdTCPClient1->IOHandler->CheckForDataOnSource(50);//等待50ms
nBytes=IdTCPClient1->IOHandler->InputBuffer->Size;
if(nBytes==0) return false;
IdTCPClient1->IOHandler->ReadBytes(tmp,nBytes); //读数据
BytesToRaw(tmp,Buffer,nBytes);
Buffer[nBytes]=0;


上面的代码,这行有问题,tmp.set_length(500); 帮助里说DynamicArray<Byte>必须要设置字节长度,但设置了后 IdTCPClient1->IOHandler->ReadBytes(tmp,nBytes); 就收不到数据,不进行设置倒是能工作,但是整段代码多运行几次后,在有的机器上会报错,Access violation at address,不知有知道怎么解决吗?
...全文
621 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
titan_ysl 2019-02-12
  • 打赏
  • 举报
回复
问题解决了,Access violation at address是别的代码出错了,与这里无关的,不过前面的代码在长时间运行时,如因系统做别的事产生卡顿,使得程序来不及处理数据,可能导致缓冲区溢出而连接断开。这时就需要程序能自动重连。修改的代码如下。  TIdBytes tmp; int nBytes; static bool ReceiveReset=false; try { tmp.set_length(0); while(IdTCPClient1->IOHandler->InputBufferIsEmpty()) { IdTCPClient1->IOHandler->CheckForDataOnSource(250); IdTCPClient1->IOHandler->CheckForDisconnect(); //如连接中断,则在程序读完缓冲区后,此函数会产生异常。 if(IdTCPClient1->IOHandler->InputBufferIsEmpty()) break; } nBytes=IdTCPClient1->IOHandler->InputBuffer->Size; if(nBytes==0) return false; ReceiveReset=false; IdTCPClient1->IOHandler->ReadBytes(tmp,nBytes); //读数据 BytesToRaw(tmp,BufferTemp,nBytes); BufferTemp[nBytes]=0; } catch(...)  //这里,捕捉到CheckForDisconnect因中断连接时产生的异常重新连接。  { if(ReceiveCheckBox->IsChecked==false) return false; ReceiveErrorFlag=true; if(ReceiveReset==false) { ReceiveReset=true; //仅重连一次,如仍不正常,则不重连。 IdTCPClient1->Connect(); return false; } Sleep(1000); return false; }
我不懂电脑 2019-01-01
  • 打赏
  • 举报
回复
直接使用最基本的byte指针,不用 DynamicArray
ooolinux 2018-12-29
  • 打赏
  • 举报
回复
500个字节是不是太少了,起码弄个32k什么。
titan_ysl 2018-12-28
  • 打赏
  • 举报
回复
ReadBytes 是最基本的,ReadInt64和ReadStream等其它的读函数都是调用它的,如ReadBytes都有问题,其它 的都没跑了。 ReadBytes是最自由的,所以我用它来读。可以实现非阻塞。 现在我发现好像上面的代码没问题,是别人的机器速度慢,数据堆积起来超出了我开的空导致访问冲突。
ooolinux 2018-12-28
  • 打赏
  • 举报
回复
没用过ReadBytes,试过ReadInt64接收流长度和ReadStream接收流。

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧