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也是静态的
是我对委托理解还不够呢?还是其他什么愿意造成的?
比较紧急,希望大家能帮忙,如果能解决,分不够可以再加呵呵 感觉这两天我把一年多积累的分全散除去了,没办法,突然被调去做以前没接触过的网络编程,还要求那么急,只好求助大家了,水平比较菜,希望回答的时候能稍微详细些,非常感谢
————————————————————————————————
运行socket.BeginReceiveFrom异步接收信息时,在回调函数中设置断点发现回调函数无法正常进入,当然也就接收不到任何信息,感觉非常奇怪,是在找不到愿意同样做的发送异步socket.BeginSendTo(sendToBuffer,0,sendCommand.Length,SocketFlags.None,ipEndPoint,new AsyncCallback(SendToCallback),udpClient);
static private void SendToCallback(IAsyncResult ar){}
却可以正常运行顺便说一句,方法全部采用static方法,socket也是静态的
是我对委托理解还不够呢?还是其他什么愿意造成的?
比较紧急,希望大家能帮忙,如果能解决,分不够可以再加呵呵 感觉这两天我把一年多积累的分全散除去了,没办法,突然被调去做以前没接触过的网络编程,还要求那么急,只好求助大家了,水平比较菜,希望回答的时候能稍微详细些,非常感谢
解决方案 »
- SQLite在C#中插入操作,代码运行无结果,求助
- asp.net 3.5 winform求一个用chart控件做的动态曲线图实例
- 【请教基本问题】private void Form1_Load(object sender, EventArgs e)
- 如何将查询的结果集存入数组
- access的排序,哪里错了帮看一下
- .net 数据集问题
- 求一个SQL SERVER2000和VS2005环境下的WEB程序源码
- 控件失去焦點,執行一段代碼
- 诚聘软件开发人员
- 问大家一个有关listbox控件的问题!
- crystal report , 布尔型的字段值,想用"男" 或"女"表示. 怎么写公式?
- 100分再求 对vs2005 中的WinForm项目制作安装程序?
public static void BeginReceiveUdp()
{
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any,4000);
EndPoint endPoint = (EndPoint)ipEndPoint;
udpClient.BeginReceiveFrom(responseBuffer,0,responseBuffer.Length,SocketFlags.None,ref endPoint,new AsyncCallback(ReceiveCallback),udpClient);
}
static private void ReceiveCallback(IAsyncResult ar){}
udpserver.cs
======================
using System;
using System.Net;
using System.Net.Sockets;
public class UdpServer
{
static Socket serverSock;
static AsyncCallback receiveCallback;
static byte[] buff;
static EndPoint senderIP ; public static void Main()
{
buff = new byte[1024];
senderIP = new IPEndPoint(IPAddress.Any, 0); receiveCallback = new AsyncCallback(OnDataReceived); serverSock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
serverSock.Bind(new IPEndPoint(IPAddress.Any, 8000));
serverSock.BeginReceiveFrom(buff, 0, buff.Length, SocketFlags.None,
ref senderIP, receiveCallback, serverSock); Console.ReadLine();
} public static void OnDataReceived(IAsyncResult ar)
{
Socket udpSocket = ar.AsyncState as Socket;
int bytesRecved = udpSocket.EndReceiveFrom(ar, ref (EndPoint)senderIP);
Console.WriteLine("{0}传来消息{1}", senderIP.ToString(), System.Text.Encoding.ASCII.GetString(buff, 0, bytesRecved)); serverSock.BeginReceiveFrom(buff, 0, buff.Length, SocketFlags.None,
ref senderIP, receiveCallback, serverSock);
}
}udpclient.cs
==============================================
using System;
using System.Net;
using System.Net.Sockets;
public class UdpClient
{
static Socket clientSock;
static byte[] buff;
public static void Main()
{
clientSock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp); string input;
while((input = Console.ReadLine()) != "exit")
{
buff = System.Text.Encoding.ASCII.GetBytes(input);
clientSock.SendTo(buff, 0, buff.Length, SocketFlags.None, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000));
} clientSock.Close();
}
}
服务器端代码我没写 serverSock.Close,呵呵,你自己加上
楼主是不是忘了在回雕函数里 调用 EndReceiveFrom,不调的话,数据是不会反回来地
我关键是用BeginReceiveFrom的时候不知道为什么程序进不去回调函数,用断点查了没有,也没有生成相应的线程呵呵 我研究下你的代码,先在这里谢谢了
udp异步的,内部应该是封装的win32 的select模型吧,其实一般场合下,我觉得udp,用组塞的模型已经够用,毕竟udp很快的,而且适合发那种小量的数据
这个。我用你的代码调试了,在BeginReceiveFrom的时候也是没有进入回调函数,也没有创建新的线程
udpserver.cs程序运行完BeginReceiveFrom就这么结束了,按道理应该进入回调函数并一直循环下去的啊汗,难道是我的.NET有问题?虽然不是正版,但也不至于如此吧........
否则的话,主线程就退出了,整个程序也退出来了
我是用断点单步调试的,运行完BeginReceiveFrom的时候(也就是开始运行Console.ReadLine的时候),应该会新建一个线程跑回调函数的,但回调函数中的断点没有反映,查看线程也没有见到新建线程
这种情况下就算主线程卡住不退出也是一样的啊
不大理解,在udpclient.cs中的8000端口应该是目标主机端口,发送端口为系统自动分配的(我通过抓包查看过了,发送端口是2781)
udpserver.cs中的8000端口应该是SOCKET的绑定端口吧?也就是说发送和监听都用这个端口好像没有什么矛盾啊
实在是太感谢了!!!
server没什么商量的,流程就是:如果你选定的端口被站用, Bind抛异常。程序初始化错误,退出当然你可以在这里换一个端口,重新bind,一般没这个必要;
我原来的代码是正确的,只是客户机器没有正确响应,但由于是异步接收不如同步直观我看到BeginReceiveFrom没有直接进入回调函数就还以为我的代码有问题结果把一个晚上加一个上午搭进去了=.=b真够要命;对SOCKET理解还不够深入啊看来顺便再问一个问题,按我的理解,异步其实就是新开一个线程,在新线程中同步发送和监听,以免阻塞主线程,那就有问题了,BeginReceiveFrom的回调函数也可以说新线程没有马上建立,也就是说BeginReceiveFrom并不会马上去监听端口取数据,那它怎么知道消息来了?莫非是当有数据进入SOCKET缓冲区的时候,会再引发一个事件通知BeginReceiveFrom去调用其回调函数,然后回调函数中的EndReceiveFrom实际并不会像Receive一样阻塞等待接收数据,而是阻塞读取数据的方法而已
——————————————————————————————————————
可以这么理解吗?靠,被Receive方法误导了,我还以为是新开了一个线程,然后EndReceiveFrom就像Receive一样阻塞住此线程,等待数据接收。。没想到EndReceiveFrom阻塞只是负责读取缓冲区数据的(也就是说数据事先已到);万恶的MSDN,居然这么重要的东西也不说清楚点T_T 还是我的理解能力太菜了?
异步版的BeginReceive,你可以这么理解,就是另起一个线程的Receive(实际要复杂多),在那个线程中等待,当那个线程有数据到来时,他会调用你定义的回雕函数, 你在回调函数里EndReceive,就把数据拷贝过来了,并结束一个Receive。其实EndReceive会组塞线程,不过在回调函数中,数据已经到了了,所以不会组塞住了。这是微软的封装模型,咱们基本上得按这个模型的套路走, 不过效率没得说,他内部实现估计应该是用的线程池,效率比咱们自己简单的起线程要高得多MSDN上关于Socket都是简单的例子,或者是程序片段,看起来确实有点摸不到边,找些大工程来看。
【中国软件开发联盟】www.itebase.com 欢迎你的加入!提供.NET,ASP.NET,C#,VB.NET,JAVA,C++,DELPHI,PHP,MS SQL,MySql,ORACLE,UML建模,软件工程...等技术的学习交流和经验,资料,源码共享...http://www.itebase.com