SOCKET异步通信中为什么要使用回调函数?

zteclx 2010-06-20 05:47:38
如下代码:
IAsyncResult result=clientSock.BeginConnect(epserver,new AsyncCallback(OnConnect),clientSock);
……
public void OnConnect(IAsyncResult ar) {//回调函数
……
}

其中的回调函数在什么情况下被执行?是在clientSock.BeginConnect这个动作一发生就执行吗?


...全文
523 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
周药师 2010-06-20
  • 打赏
  • 举报
回复
首先你要了解什么是回调函数 和回调函数的作用

什么是回调函数?

  简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

  为什么要使用回调函数?

  因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。

  如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。

  回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上,SetTimer() API使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的消息队列。

  另一个使用回调机制的API函数是EnumWindow(),它枚举屏幕上所有的顶层窗口,为每个窗口调用一个程序提供的函数,并传递窗口的处理程序。如果被调用者返回一个值,就继续进行迭代,否则,退出。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。

  不管怎么说,回调函数是继续自C语言的,因而,在C++中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或函数符(functor),而不是回调函数。
zteclx 2010-06-20
  • 打赏
  • 举报
回复
BeginConnect和EndConnect是成对出现的,EndConnect出现在回调函数中。是不是首先要执行EndConnect后才能发送数据?
zteclx 2010-06-20
  • 打赏
  • 举报
回复
我在使用异步SOCKET连接时,使用的是SOCKET客户端,去异步连接服务器端并发送数据。现在问题时,SOCKET通信有BeginConnect和BeginSendTo两种方法,是不是需要先BeginConnect中调用一个回调函数A,在A中再执行BeginSendTo调用一个回调函数B,在B中再真正发送数据?
zteclx 2010-06-20
  • 打赏
  • 举报
回复
"等待连接成功后,自动回调OnConnect函数"这个理解了。如果没有连接成功,不如连接超时了,会不会执行回调函数?
捷哥1999 2010-06-20
  • 打赏
  • 举报
回复

IAsyncResult result=clientSock.BeginConnect(epserver,new AsyncCallback(OnConnect),clientSock);
……
public void OnConnect(IAsyncResult ar) {//回调函数
……
}


是为了实现异步通信,你上面的BeginConnect方法就是异步方法,Connect方法就是同步方法。
如果用Connect方法连接,那么该方法后面的代码都无法执行,除非Connect方法返回了结果。
而用BeginConnect方法,实现的是异步的处理,调用BeginConnect方法后,会马上返回的,然后等待连接成功后,自动回调OnConnect函数!
你明白了吧!

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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