TServerSocket阻塞模式时的几个问题

LWLIFE 2016-09-01 12:08:19
阻塞模式使用线程循环接收数据,如下:

while(!Terminated && m_socket->Connected)
{
m_sMemo = m_socket->ReceiveText();
}

接收的时候如果有数据才会返回,那么当客户端断开的时候,就会立即返回,线程的判断条件依然成立 ,就这样一直循环下去,有没有办法退出这个线程,并释放掉呢?
...全文
826 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
LWLIFE 2016-09-19
  • 打赏
  • 举报
回复
放假回来不知道是否还有人关注此问题,请关注本人回复10,12楼内容。
LWLIFE 2016-09-14
  • 打赏
  • 举报
回复
引用 11 楼 silverpot 的回复:
不要用ReceiveText()函数,感觉它不受阻塞影响。即使设置成阻塞模式,它也是调用就返回,没有数据就返回为空。 官方文档里说,阻塞模式要用 TWinSocketStream *pClientStream;//TWinSocketStream to read or write information over a blocking socket connection pClientStream=new TWinSocketStream(ClientSocket1->Socket,TIMEOUT);
受教,不过似乎还是不行,连接后,能正常会送,客户端主动断的(Active=false;)服务端收不到消息WaitForData依然返回成功。Read返回0,不知道用这个0判断断开是否有效。
LWLIFE 2016-09-13
  • 打赏
  • 举报
回复
标题忘记说明了,我用的是TClientSocket和TServerSocket这两个控件,没办法直接使用上面说的函数。帖子又没有办法修改。
银点 2016-09-13
  • 打赏
  • 举报
回复
不要用ReceiveText()函数,感觉它不受阻塞影响。即使设置成阻塞模式,它也是调用就返回,没有数据就返回为空。 官方文档里说,阻塞模式要用 TWinSocketStream *pClientStream;//TWinSocketStream to read or write information over a blocking socket connection pClientStream=new TWinSocketStream(ClientSocket1->Socket,TIMEOUT);
LWLIFE 2016-09-08
  • 打赏
  • 举报
回复
引用 8 楼 FASM_FASM 的回复:
嘿,真有意思。上面的MSDN不是已经告诉你解决方法了吗? 当你的接收函数: 返回一个正值,表示是你的接收到的数据字节数。 返回0值时,就表示连接伙伴已经主动断开连接了。 返回-1(SOCKET_ERROR)时,表示发生了一个网络错误。你可以用WSAGetLastError函数来获得具体原因。
OO ,没注意到上面说的是recv这个方法,我一直用的是ReceiveText这个方法,这个方法只会返回空字符串。
LWLIFE 2016-09-07
  • 打赏
  • 举报
回复
这个问题无解了?
FASM_FASM 2016-09-07
  • 打赏
  • 举报
回复
嘿,真有意思。上面的MSDN不是已经告诉你解决方法了吗? 当你的接收函数: 返回一个正值,表示是你的接收到的数据字节数。 返回0值时,就表示连接伙伴已经主动断开连接了。 返回-1(SOCKET_ERROR)时,表示发生了一个网络错误。你可以用WSAGetLastError函数来获得具体原因。
LWLIFE 2016-09-06
  • 打赏
  • 举报
回复
这个不好解决吗
LWLIFE 2016-09-05
  • 打赏
  • 举报
回复
引用 4 楼 silverpot 的回复:
你连接断开了,m_socket->Connected就为false了,不就退出循环了么?!
现在的情况是客户端点击断开,服务端的m_socket->Connected还是为True,就导致循环会继续,只不过接收会不断的返回空。
银点 2016-09-05
  • 打赏
  • 举报
回复
你连接断开了,m_socket->Connected就为false了,不就退出循环了么?!
FASM_FASM 2016-09-05
  • 打赏
  • 举报
回复
求人不如求己,这末简单的问题还不如自己查帮助: recv function The recv function receives data from a connected socket or a bound connectionless socket. Syntax int recv( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags ); Parameters s [in] The descriptor that identifies a connected socket. buf [out] A pointer to the buffer to receive the incoming data. len [in] The length, in bytes, of the buffer pointed to by the buf parameter. flags [in] A set of flags that influences the behavior of this function. See remarks below. See the Remarks section for details on the possible value for this parameter. Return value If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero. 摘自MSDN。
LWLIFE 2016-09-05
  • 打赏
  • 举报
回复
论坛现在人气不高呀。
LWLIFE 2016-09-02
  • 打赏
  • 举报
回复
没人关注了吗

1,316

社区成员

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

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