[请教]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
//软件却发现已经收到了
}
...全文
145 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);
}
}

1,316

社区成员

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

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