none
c#udpclient问题 RRS feed

  • 问题

  • 各位老师好,本人新手,以下是我调用udpclient的一段代码,用来与另一端传输信息。但是由于使用的是timer方式,所以

    send()要被重复执行,可是8001端口声明后,再次运行就会报错,该端口已经使用。程序中我也用到了close,可是不管用啊。。。请问有什么好方法解决没有!谢谢了!!

    public  string send(string message)
            {
                UdpClient udpclient = new UdpClient(8001);  

                
                try
                {                
                    byte[] sendbytes = System.Text.Encoding.Unicode.GetBytes(message);
                    udpclient.Send(sendbytes, sendbytes.Length, ipadd(), 8000);
                    if (message == "quit")
                    {
                        MessageBox.Show("send already");
                        //Console.WriteLine("send already");
                        udpclient.Close();
                       
                        return "quit";
                    }
                    else
                    {
                        IPEndPoint myhost = null;
                        byte[] getbyte = udpclient.Receive(ref myhost);
                        string getstring = System.Text.Encoding.Unicode.GetString(getbyte);

                        //Console.WriteLine("re:{0}", getstring);
                        udpclient.Close();
                        return getstring;
                    }
                }

    2010年6月2日 16:21

答案

  • 你好!

         Timer的任务是放在线程池中执行的,很可能你的一次任务还没有结束就进行第二次任务了,这时端口已经被占用了,你又再次请求了,所以发生了这个问题!你把UdpClient udpclient定义为成员变量试试,这样每次使用的就是同一个实例了!


    周雪峰
    2010年6月4日 4:31
    版主
  • 给你个好办法建议

    首先在这个方法内部点一个断点 然后选择调试

    然后在开始 运行里面 输入wmic  回车 进入命令行模式

    再输入process

    这里列出你当前的所有进程占据的端口

    你需要特别注意当程序第二次的时候 看端口是否被占用 被那里占用了

    版主的所说的应该是你所遇到的问题的根本原因。

    如果timer的周期不好固定的话 你可以在每次操作之前都对端口进行检查 如果被使用 就sleep当前的线程

     

    2010年6月4日 6:09

全部回复

  • 你好!

         Timer的任务是放在线程池中执行的,很可能你的一次任务还没有结束就进行第二次任务了,这时端口已经被占用了,你又再次请求了,所以发生了这个问题!你把UdpClient udpclient定义为成员变量试试,这样每次使用的就是同一个实例了!


    周雪峰
    2010年6月4日 4:31
    版主
  • 给你个好办法建议

    首先在这个方法内部点一个断点 然后选择调试

    然后在开始 运行里面 输入wmic  回车 进入命令行模式

    再输入process

    这里列出你当前的所有进程占据的端口

    你需要特别注意当程序第二次的时候 看端口是否被占用 被那里占用了

    版主的所说的应该是你所遇到的问题的根本原因。

    如果timer的周期不好固定的话 你可以在每次操作之前都对端口进行检查 如果被使用 就sleep当前的线程

     

    2010年6月4日 6:09