调用CAsyncSocket类的Connect时为什么会出现类似阻塞的样子,界面不刷新

kangfx 2003-08-22 03:35:42
运行环境:Win2000
通过网关代理上网(ADSL)

我写了一个客户端的软件,没有用多线程,当登录服务器时,创建了一个CAsyncSocket类的对象,但是在调用Connect方法时如果网关关机或停掉了服务则会出现界面无法刷新的情况(2--4秒左右),很恶心的,请问各位怎么回事啊,CAsyncSocket采用的可是非阻塞的IO模型啊。不应该出现这种事情啊,我是前天才将CSocket改为CAsyncSocket的
...全文
40 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
flinming 2003-08-25
  • 打赏
  • 举报
回复
应该不不会吧

你没有去处理onclose函数么,如果网关关机或停掉了服务关闭,你应该先去处理断开了
PowerOffHong 2003-08-25
  • 打赏
  • 举报
回复
我作过类似的程序开始也是楼主的问题!后来把工作用户界面和工作线程分开来就好了!所以同意楼上大家所述!
cboy2wzhx 2003-08-25
  • 打赏
  • 举报
回复
同意一楼的
dev_uoboy 2003-08-25
  • 打赏
  • 举报
回复
工作线程一定要和用户界面分开,一般用户界面是主线程,面对客户你的程序一定不要出现什么延迟,不然就算是几秒钟,用户也可能对你的产品产生反感。
ahao 2003-08-22
  • 打赏
  • 举报
回复
Connect会调用gethostbyname,这个函数是阻塞的
网络编程,当然要用到Windows Socket(套接字)技术。Socket相关的操作由一系列API函数来完成,比如socket、bind、listen、connect、accept、send、sendto、recv、recvfrom等。调用这些API函数有一定的先后次序,有些函数的参数还比较复杂,对于开发者来说,不是很好用。于是,微软的MFC提供了两个CAsyncSocket和CSocket,极大地方便了Socket功能的使用。   CAsyncSocket在较低层次上封装了Windows Socket API,并且通过内建一个(隐藏的)窗口,实现了适合Windows应用的异步机制(Windows Socket API默认情况下工作在阻塞模式,不方便直接在消息驱动的Windows程序上使用)。CSocketCAsyncSocket派生,进一步简化了Socket功能的应用。不过很遗憾,正因为这两个都内建了一个窗口,它们并不是线程安全的(thread-safe);如果要在多线程环境下应用Socket功能,建议自行封装Socket API函数。 基于TCP的socket编程的服务器端程序流程如下: 1、创建套接字 2、将套接字绑定到一个本地地址和端口号上(bind) 3、将套接字设为监听模式,准备接受客户请求(listen) 4、等待客户请求,请求到来接受请求,建立链接,并返回 一个新的基于此次通信的套接字(accept) 5、用返回的套接字和客户端进行通信(send、recv) 6、返回,等待另一客户请求 7、关闭套接字 基于TCP的socket编程的客户端程序流程如下: 1、创建套接字 2、向服务器端发送请求(connect) 3、和服务器端进行通信(send、recv) 4、关闭套接字 基于UDP的socket编程的服务器端程序流程如下: 1、创建套接字 2、将套接字绑定到本地地址和端口号上(bind) 3、等待接收数据(recvfrom) 4、关闭套接字 基于UDP的socket编程的客户端程序流程如下: 1、创建套接字 2、和服务器端进行通信(sendto) 3、关闭套接字 异步方式指的是发送方不等接收方响应,便接着发下个数据包的通信方式;而同步指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式。   阻塞套接字是指执行此套接字的网络调用,直到成功才返回,否则一直阻塞在此网络调用上,比如调用recv()函数读取网络缓冲区中的数据,如果没有数据到达,将一直挂在recv()这个函数调用上,直到读到一些数据,此函数调用才返回;而非阻塞套接字是指执行此套接字的网络调用,不管是否执行成功,都立即返回。比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不一直挂在此函数调用上。在实际Windows网络通信软件开发中,异步非阻塞套接字是用的最多的。平常所说的C/S(客户端/服务器)结构的软件就是异步非阻塞模式的。   对于这些概念,初学者的理解也许只能似是而非,我将用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制。目的是让初学者不仅对Socket异步非阻塞的概念有个非常透彻的理解,而且也给他们提供一个用Socket开发网络通信应用程序的快速入门方法。操作系统是Windows 98(或NT4.0),开发工具是Visual C++6.0。   MFC提供了一个异步CAsyncSocket,它封装了异步、非阻塞Socket的基本功能,用它做常用的网络通信软件很方便。但它屏蔽了Socket的异步、非阻塞等概念,开发人员无需了解异步、非阻塞Socket的原理和工作机制。因此,建议初学者学习编网络通信程序,暂且不要用MFC提供的,而先用Winsock2 API,这样有助于对异步、非阻塞Socket编程机制的理解。

18,355

社区成员

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

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