积极答复者
c#udpclient问题

问题
-
各位老师好,本人新手,以下是我调用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;
}
}
答案
-
你好!
Timer的任务是放在线程池中执行的,很可能你的一次任务还没有结束就进行第二次任务了,这时端口已经被占用了,你又再次请求了,所以发生了这个问题!你把UdpClient udpclient定义为成员变量试试,这样每次使用的就是同一个实例了!
周雪峰- 已标记为答案 KeFang Chen 2010年6月7日 1:48
-
给你个好办法建议
首先在这个方法内部点一个断点 然后选择调试
然后在开始 运行里面 输入wmic 回车 进入命令行模式
再输入process
这里列出你当前的所有进程占据的端口
你需要特别注意当程序第二次的时候 看端口是否被占用 被那里占用了
版主的所说的应该是你所遇到的问题的根本原因。
如果timer的周期不好固定的话 你可以在每次操作之前都对端口进行检查 如果被使用 就sleep当前的线程
- 已标记为答案 KeFang Chen 2010年6月7日 1:48
全部回复
-
你好!
Timer的任务是放在线程池中执行的,很可能你的一次任务还没有结束就进行第二次任务了,这时端口已经被占用了,你又再次请求了,所以发生了这个问题!你把UdpClient udpclient定义为成员变量试试,这样每次使用的就是同一个实例了!
周雪峰- 已标记为答案 KeFang Chen 2010年6月7日 1:48
-
给你个好办法建议
首先在这个方法内部点一个断点 然后选择调试
然后在开始 运行里面 输入wmic 回车 进入命令行模式
再输入process
这里列出你当前的所有进程占据的端口
你需要特别注意当程序第二次的时候 看端口是否被占用 被那里占用了
版主的所说的应该是你所遇到的问题的根本原因。
如果timer的周期不好固定的话 你可以在每次操作之前都对端口进行检查 如果被使用 就sleep当前的线程
- 已标记为答案 KeFang Chen 2010年6月7日 1:48