C# UDP 通讯问题??(新人简单问题)
我在手机(多普达 htc s900)上通过GPRS做一个简单的UDP通讯。环境:vs2008 + windows mobile 6 SDK
代码:
private UdpClient MyUDP;
private Thread UdpThread;
private string recvBuf;
//初始化
private void menuItem6_Click(object sender, EventArgs e)
{
//IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
MyUDP = new UdpClient("121.227.175.137", 9999);
}
//发送
private void button3_Click(object sender, EventArgs e)
{
Byte[] sendBytes = Encoding.ASCII.GetBytes("test");
MyUDP.Send(sendBytes, sendBytes.Length);
listBox1.Items.Add("button3_Click");
}
//接收
private void button4_Click(object sender, EventArgs e)
{
UdpThread = new Thread(this.UdpReciveThread);
UdpThread.Start();
}
private void UpdateUI(object sender,EventArgs e)
{
// listBox1.Items.Add(Encoding.ASCII.GetString(recvData, 0, recvCount));
listBox1.Items.Add(recvBuf);
}
private void UdpReciveThread()
{
IPEndPoint remoteHost = null;
while ((MyUDP != null))
{
try
{
byte[] buf = MyUDP.Receive(ref remoteHost);
recvBuf = Encoding.UTF8.GetString(buf, 0, buf.Length);
this.Invoke(new EventHandler(this.UpdateUI));
}
catch (Exception e)
{
MessageBox.Show("Receive error:"+e.Message);
}
}
}
如上代码中,手机和我的PC机通讯。
问题:
在第一次执行这句代码("MyUDP = new UdpClient("121.227.175.137", 9999);")时,速度很慢(差不多都要10s以上时间)。以后关闭exe再打开,就快了,为什么这么慢?------① 能弄快一点吗?------②
我对C#语言不熟悉,我这段UDP通讯代码基本还正确吧?------③
我在关闭exe时,出现报错"Receive error:阻塞操作被WSACancelBlockCall调用中断",如何改进才能不报错?------④ 还是说可以把"MessageBox.Show("Receive error:"+e.Message);"这句代码去掉,忽略这个报错?------⑤
我用 "Socket newsock =......"然后"recv =newsock.ReceiveFrom(data ,ref Remote);"也是会在exe关闭时阻塞报错,想用异步操作,网上看的"高效UDP异步编程",但是在WM里vs2008告诉我 "“System.Net.Sockets.UdpClient”不包含“BeginReceive”的定义,并且找不到可接受类型为“System.Net.Sockets.UdpClient”的第一个参数的扩展方法“BeginReceive”(是否缺少 using 指令或程序集引用?)"。熟悉的 WSAAsyncSelect 好像也没有。能告诉我怎么用异步?------⑥
我是接触WM才接触C#的,水平很菜。请大家根据上面①②③④⑤⑥帮我讲解下,解决下我的问题,谢谢。
只要能让程序运行流畅,不报错,操作流畅OK,随便异步同步,上面方法都行。 --------------------编程问答-------------------- LZ是用什么接入点连接的 ? UDP的话建议用CMNET. --------------------编程问答-------------------- lz 肯定是 CMNET 连接,否则他的代码连不上;首次连接慢是正常的,你可以看看你的 PC 端的日志,两边比比看。 --------------------编程问答-------------------- 是CMNET,看看 那个退出报错怎么解决?不管它还是 异步?还是什么??至少讲个思路啊 --------------------编程问答--------------------
没弄过C#,不过你可以采用类似C++ 继承CAsyncSocket的方法实现. --------------------编程问答-------------------- 我这有个C++ UDP程序:
private:
//定义UDP通讯类变量
CUDP_CE m_CEUdp;
DWORD nResult = m_CEUdp.Open(this,m_LocalPort,m_RemoteHost.GetBuffer(m_RemoteHost.GetLength()),m_RemotePort);
这个操作不慢的,速度很快啊。
PS:我GPRS连接 是用另一个程序(名叫"Windows Mobile中如何建立GPRS连接一遍Socket能正常通信")先建立好的 --------------------编程问答-------------------- 来个人讲讲哦~~
忽略这个报错 ---> 感觉肯定是不可靠的
其他方式 ---> 我不会,没思路啊 --------------------编程问答-------------------- 自己 UP 下 --------------------编程问答-------------------- UPUP --------------------编程问答-------------------- 用同步的方式就是会这样啊,Receive会被一直阻塞等到数据到来。在没有数据来的时候,你close了socket就会中断阻塞,产生 error:阻塞操作被WSACancelBlockCall调用中断
避免方法:try{}catch(SocketException){}
哈哈 --------------------编程问答--------------------
我知道这是同步方式造成的。
但是我用 异步 时,如我楼顶所说 编译不通过,不知道WM里C#异步如何实现???
按你所说,用try...catch的话,我楼顶代码也有try...catch ,那就是说 catch 到了异常 不去管它,让它去就好了,是这样不?? --------------------编程问答-------------------- 如果是异步方式,你最好去查查相关例子啊!MSDN上有Demo
try...catch 不是不管异常,是一种妥协。在调试上可以调出的什么异常 --------------------编程问答-------------------- 学习学习 --------------------编程问答-------------------- 首次运行是慢;try...catch一下,不去管。异步的方法可以去网上找 --------------------编程问答-------------------- 在 http://msdn.microsoft.com/en-us/library/600stss7(v=VS.100).aspx 看了 Socket Method。
其中 UDP 的异步 "SendToAsync : Sends data asynchronously to a specific remote host." 和 "ReceiveFromAsync : Begins to asynchronously receive data from a specified network device. " 在Windows Mobile 6里都没有啊????? --------------------编程问答-------------------- 测试用模拟器的吗
补充:移动开发 , Windows Phone