[请教]TWinSocketStream接收数据长度为0,实际已经收到的问题

zuoyefeng 2006-03-22 05:16:43
我在服务端用TWinSocketStream接收客户端发过来的数据,服务端阻塞模式,可是我却用TWinSocketStream的read接收不到任何数据,用sniffor软件嗅探时却发现其实客户端已经把数据发过来了,这个问题好像以前谁也遇到过,最后不知道用什么方法给解决了,请知道的朋友帮帮我,这个问题实在让我郁闷
代码如下:
while (!Terminated && ClientSocket->Connected)
{
if (pStream != NULL){
delete pStream;
}
pStream = new TWinSocketStream(ClientSocket, TimeOut);

if (pStream->WaitForData(60000))
{
recvlen = pStream->Read(recv_buf, 1024); //recvlen的值为0,recv_buf里也没有任何数据
} //重复接收多次的结果也是一样,我用sniffor
//软件却发现已经收到了
}
...全文
225 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuoyefeng 2006-03-24
  • 打赏
  • 举报
回复
呵呵这样也可以
不过说实话
以后关键部分我可是不太敢用控件了
还是老老实实的sdk比较好
主要是我对这些封装好了的控件不是很了解
结贴拉
以后多交流:)

zuoyefeng 2006-03-23
  • 打赏
  • 举报
回复
你这样子应该可以,不知道我那种问题能解决不,我试试看去,咱们继续讨论讨论
void Read(unsigned char* buf,int size){
int tmpint=0;
while(!Terminated){
if (pStream->WaitForData(50)){
int len = pStream->Read(recv_buf+tmpint, size-tmpint);
if(len==0)break;//这里len==0的时候个人感觉continue比较好些,要不直接就跳出了
tmpint+=len;
if(tmpint>=size)break;
}
}
}

soloxiao 2006-03-23
  • 打赏
  • 举报
回复
其实我是这样的:
void TOneDevice::Read(unsigned char* buf,int size){
int tmpint=0;
int len = 1;
while(m_bConnected && !Terminated && len>0){
len = 0;
if (csStream->WaitForData(100)){
len = csStream->Read(buf+tmpint, size-tmpint);
tmpint+=len;
if(tmpint>=size)break;
}
}
}

void __fastcall TOneDevice::Execute()
{
while (!Terminated)
{
if(!m_bConnected){
TryConnect();
continue;
}
SendData...
Sleep(50);//视情况调整大小
Read->处理
}
}
soloxiao 2006-03-22
  • 打赏
  • 举报
回复
TWinSocketStream 一般是在Connected是new 出来的,读一些不定时的数据我一般这样:

void Read(unsigned char* buf,int size){
int tmpint=0;
while(!Terminated){
if (pStream->WaitForData(50)){//这样避免多余的等待
int len = pStream->Read(recv_buf+tmpint, size-tmpint);
if(len==0)break;
tmpint+=len;
if(tmpint>=size)break;
}
}
}
zuoyefeng 2006-03-22
  • 打赏
  • 举报
回复
晕看来我的信誉值又得减了
我已经解决了,在接收前Sleep2秒就可以了
while (!Terminated && ClientSocket->Connected)
{
if (pStream != NULL){
delete pStream;
}
pStream = new TWinSocketStream(ClientSocket, TimeOut);

if (pStream->WaitForData(60000))
{
Sleep(2000); //网速较慢的等上几秒就可以了,要不就会出现莫名其妙的错误了
recvlen = pStream->Read(recv_buf, 1024);
}
}
内容概要:本文围绕四旋翼无人机悬停控制问题,基于线性化动力学模型,系统性地对比研究了三种经典控制范式:PID(比例-积分-微分控制)、LQR(线性二次型调节器)和MPC(模型预测控制)。研究从“误差驱动”的反馈控制思想(PID、LQR)与“滚动优化”的前瞻控制思想(MPC)两种核心理念出发,深入阐述了各算法的设计原理、数学建模、控制器设计流程与实现细节,并借助Matlab代码完成了完整的仿真验证。重点剖析了不同控制方法在动态响应品质(如上升时间、超调量、稳态精度)与计算资源消耗(实时性要求)之间的内在权衡,为无人机飞控及其他高动态系统的算法选型提供了详实的基准评估依据和实践指导。; 适合人群:具备自动控制理论基础和Matlab编程能力的高校研究生、科研人员及自动化、航空航天领域的工程技术人员。; 使用场景及目标:① 学习和掌握PID、LQR、MPC三种核心控制算法的理论内涵与工程实现;② 深刻理解“误差反馈”与“模型预测”两种根本性控制哲学的差异与适用边界;③ 为高阶、复杂的控制系统设计与算法选型提供性能对比的量化参考基准。; 阅读建议:学习者应结合所提供的Matlab代码,亲自动手复现仿真过程,通过调整系统参数、控制器增益和初始扰动,深入探究各算法的动态响应特性、鲁棒性表现及各自的优缺点。

1,317

社区成员

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

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