TcpListener占用的端口如何释放?

mmiikkeedd 2007-01-30 11:08:00
我用一个线程创建一个TcpListener并监听
然后停止监听
当再次开始监听的时候就会报错:
通常每个套接字地址(协议/网络地址/端口)只允许使用一次
不知道怎么解决啊?
注:我在停止监听的时候执行了stop方法,也执行过它里面socket的close方 法,还abort过那个线程,但是都失败了,郁闷了...
...全文
1564 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
darkh0rse 2007-02-25
  • 打赏
  • 举报
回复
是不是因为没有执行Client.Close()?
dengjiyun 2007-02-25
  • 打赏
  • 举报
回复
17172715到我的群里来讨论
lingdu_hua 2007-01-30
  • 打赏
  • 举报
回复
恩那,关闭TCPLISTENER时候不要放在TRY CATCH里.
不报错,程序正常运行.
Red_angelX 2007-01-30
  • 打赏
  • 举报
回复
private void buttonStop_Click(object sender, EventArgs e)
你只有停止线程的代码没有停止TCP的代码啊~

private void Connection()
{
try
{
tcplistener = new TcpListener(1218);
tcplistener.Start();
Debug("Start Server Success");
do
{
//Your Code Here
}
while(true);
}
catch(SocketException ee)
{
//Debug
Debug(ee.ToString());
}
}
private void DisConn()
{
try
{
tcplistener.Stop();
Debug("Stop Success");
}
catch(Exception)
{
tcplistener.Stop();
}
}
mmiikkeedd 2007-01-30
  • 打赏
  • 举报
回复
用GC手动清除都不行啊
看来只能用Socket试试了
又碰上一个糊里糊涂的控件
mmiikkeedd 2007-01-30
  • 打赏
  • 举报
回复
能在最后手动清除tcplistener对象么?
tgl10 2007-01-30
  • 打赏
  • 举报
回复
是啊,socket更好,TcpListener不必存在的
sqfeiyu 2007-01-30
  • 打赏
  • 举报
回复
TcpListener是有這個毛病﹐你試試在一個將TcpListener封裝在一個類中﹐停止時將類釋放.
建議用Socket
mmiikkeedd 2007-01-30
  • 打赏
  • 举报
回复
很多方法都尝试过了
但是不行啊
mmiikkeedd 2007-01-30
  • 打赏
  • 举报
回复
...
private bool isExit;
//保存所有连接的客户端
System.Collections.ArrayList clientList = new System.Collections.ArrayList();
TcpListener listener;

//用于一个线程操作另一个线程的代理和回调函数
private delegate void SetListBoxCallBack(string str);
private SetListBoxCallBack setListBoxCallBack;

private delegate void SetRichTextBoxCallback(string str);
private SetRichTextBoxCallback setRichTextBoxCallback;

private delegate void SetComboBoxCallback(object str);
private SetComboBoxCallback setComboBoxCallback;

private delegate void RemoveComboBoxItemsCallback(ReadWriteObject readWriteObject);
private RemoveComboBoxItemsCallback removeComboBoxItemsCallback;

//用于线程的同步
private EventWaitHandle allDone = new EventWaitHandle(false, EventResetMode.ManualReset);

private Thread myThread;
...
...

//开始监听
private void buttonStart_Click(object sender, EventArgs e)
{
//创建一个线程专门负责处理客户请求
ThreadStart ts = new ThreadStart(AcceptConnect);
myThread = new Thread(ts);
myThread.Start();
buttonStart.Enabled = false;
buttonStop.Enabled = true;
}

//负责监听客户连接的--------------线程方法
public void AcceptConnect()
{
//获取本机的ip地址
IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName());
listener = new TcpListener(ip[0], 51888);
listener.Start();
while (isExit == false)
{
try
{
//将事件的状态设置为非终止
allDone.Reset();

//引用在异步操作完成时调用的回调方法
AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);
listBoxStatus.Invoke(setListBoxCallBack, "开始等待客户连接");

//开始一个异步操作接受传入连接尝试
listener.BeginAcceptTcpClient(callback, listener);

//阻塞当前线程,直到收到客户连接信号
allDone.WaitOne();

}
catch (Exception err)
{
listBoxStatus.Invoke(setListBoxCallBack, err.Message);
break;
}
}

//listener.Server.Close();
}

//停止监听
private void buttonStop_Click(object sender, EventArgs e)
{
isExit = true;//设退出标志位为真

allDone.Set();//使处理等待连接的线程继续执行

try
{
myThread.Abort();
}
catch (Exception mm)
{
//do nothing
}
buttonStart.Enabled = true;
buttonStop.Enabled = false;
}
Red_angelX 2007-01-30
  • 打赏
  • 举报
回复
贴代码

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧