客户端接收不到数据。

ablefirst 2003-11-20 11:43:09
开始连接,服务端显示连接成功,这时客户端处于忙等待状态(漏斗状态),服务端发数据客户也接收不到,当服务端退出,这时客户端的数据都显示出来了。奇怪,为什么,帮忙改一下。
if (connect(client,(struct sockaddr *)&addr,sizeof(addr)))
{
MessageBox("fail.");
closesocket(client);
return;
}
memset(buff,0,sizeof(buff));
m_listmessage.InsertItem(0,"link success!");
int s;
while(true)
{
s=recv(client,buff,100,0);
if(s==SOCKET_ERROR )
break;
 m_listmessage.InsertItem(count++,buff);
}
...全文
103 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xsc2001 2003-11-20
  • 打赏
  • 举报
回复
呵呵,上面说的都对!
rtdb 2003-11-20
  • 打赏
  • 举报
回复
楼主还没懂。
你那个程序一执行到recv, 就等在那里直到收到信息,
外面再加上个while(true), 那么一直到(s==SOCKET_ERROR )(也就是服务端退出),
你的程序都不会有响应,和死了一样。

所以recv一般要和多线程配合使用。 否则程序总是死等,不可以有UI的。

ablefirst 2003-11-20
  • 打赏
  • 举报
回复
如果把它屏了
//m_listmessage.InsertItem(count++,buff);
也不行,也是等待。
m_listmessage.InsertItem(0,"link success!");这句也没有显示,服务端退出后,也才显示。
如果是再开一个线程,接收数据不也要用循环中。
求助!
enoloo 2003-11-20
  • 打赏
  • 举报
回复
我想应该是这个原因.因为一直在循环中,所以客户端一直忙,如果是单线程的程序就不能接收消息.
如果不用多线程,可以加入消息泵,用发送消息的方式强制刷新.

SlayerCarrier 2003-11-20
  • 打赏
  • 举报
回复
你都在一个循环中recv,然后就InsertItem,此时m_listmessage虽然已经加入了数据,但是你的循环没有退出,所以m_listmessage得不到重绘,所以数据显示不出.
解决办法:在开一个线程处理recv和Connect.
ablefirst 2003-11-20
  • 打赏
  • 举报
回复
感谢各位。
ske3 2003-11-20
  • 打赏
  • 举报
回复
用socket的recvice事件不可以吗?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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