日期:2014-05-19  浏览次数:21307 次

求助:socket.BeginReceiveFrom异步接收信息时,回调函数无法正常进入
socket.BeginReceive(responseBuffer,0,256,SocketFlags.None,new   AsyncCallback(ReceiveCallback),   udpClient);

static   private     void   ReceiveCallback(IAsyncResult   ar){}
————————————————————————————————
运行socket.BeginReceiveFrom异步接收信息时,在回调函数中设置断点发现回调函数无法正常进入,当然也就接收不到任何信息,感觉非常奇怪,是在找不到愿意

同样做的发送异步socket.BeginSendTo(sendToBuffer,0,sendCommand.Length,SocketFlags.None,ipEndPoint,new   AsyncCallback(SendToCallback),udpClient);
static   private     void   SendToCallback(IAsyncResult   ar){}
却可以正常运行

顺便说一句,方法全部采用static方法,socket也是静态的


是我对委托理解还不够呢?还是其他什么愿意造成的?
比较紧急,希望大家能帮忙,如果能解决,分不够可以再加

呵呵   感觉这两天我把一年多积累的分全散除去了,没办法,突然被调去做以前没接触过的网络编程,还要求那么急,只好求助大家了,水平比较菜,希望回答的时候能稍微详细些,非常感谢

------解决方案--------------------
回调函数不会马上被调用,

只有受到client的信息之后,回调函数才会被调用。 这个时候,缓冲区里也才有数据。

你测试下,udpclient发数据之后,server 的回调被调用没
------解决方案--------------------
我去接分了。

你理解的差不多。
异步版的BeginReceive,你可以这么理解,就是另起一个线程的Receive(实际要复杂多),在那个线程中等待,当那个线程有数据到来时,他会调用你定义的回雕函数, 你在回调函数里EndReceive,就把数据拷贝过来了,并结束一个Receive。其实EndReceive会组塞线程,不过在回调函数中,数据已经到了了,所以不会组塞住了。

这是微软的封装模型,咱们基本上得按这个模型的套路走, 不过效率没得说,他内部实现估计应该是用的线程池,效率比咱们自己简单的起线程要高得多

MSDN上关于Socket都是简单的例子,或者是程序片段,看起来确实有点摸不到边,找些大工程来看。