当前位置:编程学习 > wap >>

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,看看 那个退出报错怎么解决?不管它还是 异步?还是什么??至少讲个思路啊 --------------------编程问答--------------------
引用 3 楼 okmnji79513 的回复:
是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){}

哈哈 --------------------编程问答--------------------
引用 9 楼 wo65432519 的回复:
用同步的方式就是会这样啊,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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,