请教如何用CAsyncSocket替代CSocket?

redeemer 2001-10-15 01:37:46
本人已完成一个邮件发送模块,可惜发送过程是异步阻塞的,因为用的是CSocket建立连接的,所以想用其父类CAsyncSocket来替代CSocket实现异步发送,即点击“发送”以后程序直接返回而不是阻塞,可是查看了MSDN等资料均不得法,哪位高手给予点拨?多谢!
...全文
92 点赞 收藏 10
写回复
10 条回复
caiyi9000 2001年10月18日
to redeemer:
你是什么水平?CSocket是CAsyncSocket的派生类,当然是异步非阻塞的了!
回复 点赞
redeemer 2001年10月17日
非也,其实CSocket是个实实在在的阻塞同步类,这点我想不会有错,否则我也不会在这发愁了,因为我需要它不同步,调用后要能立即返回
回复 点赞
redeemer 2001年10月16日
楼上的,抱歉,我为我的鲁莽向你道歉,我以为你是在瞎搅和呢,可谁让你说“CSocket是异步非阻塞”呢?在不了解的情况下我只能凭借这句话来认知你了,当然现在我知道这是不对的了:)我的qq:290487,欢迎常联系,我现在被这个问题搞得心情很不好,抱歉!
回复 点赞
caiyi9000 2001年10月16日
to redeemer:
没关系,其实CSocket是CAsyncSOcket类的派生类 ,当然也是异步非阻塞的了!
回复 点赞
caiyi9000 2001年10月15日
to redeemer:
顾名思义,CAsyncSocket是一个异步SOCKET类。async就是异步单词的缩写。你知道ATM全称是什么?是什么意思吗?你知不知道用CAsyncSocket定义的对象,就已经是个异步对象了。
CAsyncSOcket m_Socket;
m_Socket.Create(...);
就已经将此socket设置为异步模式,并注册了ACCEPT,CONNECT,WRITE,READ,CLOSES等异步事件,你只要重载CAsyncSocket提供的虚函数OnAccept(), OnConnect(),OnReceive().OnSend(), OnClose()等,就可以响应这些网络异步事件了.具体编程方法如下:

服务器侧,一旦有连接请求到达时,程序就会执行到OnAccept(),在OnAccept()中,你可以调用m_Socket.Accept()接受一个连接请求,并返回一个socket与发起连接请求的客户端进行通信。
客户端侧,当发起一个连接请求时,就会执行到OnConnet()函数,你可以在OnConnect()中做相应处理。
服务器和客户端侧,当网络缓冲区中有网络数据到达时,均会执行到OnReceive()函数中,你就可以调用m_Socket.Recv()函数读取网络缓冲区中的数据了。注意接收网络数据的工作只能在OnReceve()中进行,因为你不知道什么时候有网络到达,只有OnReceive()函数才能通知你的程序有网络数据到达了。
服务器和客户端侧,当你发送网络数据时,均会执行到OnSend()函数,你可以在此函数中做一些发送网络数据时的处理工作。
在OnClose()函数中,你可以做一些通信对端断开后的善后处理工作。

其实如果你对winsock API熟悉的话,你自己都可以用SDK开发出一个CAsyncSocket类来。
如果你还不明白的话,请你到开发文档中看看我发表的文章《Windows网络编程经典入门》。否则不要在此乱咬人!
回复 点赞
caiyi9000 2001年10月15日
to redeemer:
我还没见过象你这样的笨蛋,还需要什么回调函数?先回家问问老婆!
回复 点赞
redeemer 2001年10月15日
caiyi9000,你回家看看说在来!
skyonsky,光说不练的家伙!
scklotz,好用在哪?听说CAsyncSocket需要一个回调参数才能实现异步,具体怎么做呢?
回复 点赞
scklotz 2001年10月15日
CAsyncSocket很好用。
接收数据在OnReceive里处理,发送数据就直接调用Send
回复 点赞
skyonsky 2001年10月15日
CSocket 是CAsyncSocket的派生类吧,CAsyncSocket当然可以做CSocket的工作
不过你的水平的相当高才行。
哈哈
回复 点赞
caiyi9000 2001年10月15日
有没有搞错,CSocket是异步非阻塞的吧!
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告