C# udpclint 端口如何释放?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# udpclint 端口如何释放?相关的知识,希望对你有一定的参考价值。

第一次点启动工作正常,点停止后再点启动就会在UdpClient UDPserver = new UdpClient(123)报错:“通常每个套接字地址(协议/网络地址/端口)只允许使用一次。”。要怎么样才能解决这个问题呢?

//UDP服务端
private void server()

UdpClient UDPserver = new UdpClient(123);
IPEndPoint IP = null;
try

while (true)

UDPserver.Receive(ref IP);
bytes = Encoding.UTF8.GetBytes("您好!");
UDPserver.Send(bytes, bytes.Length,IP);


catch (Exception e)



//启动
List<Thread> ThreadList = new List<Thread>();
private void button1_Click(object sender, EventArgs e)

Thread t = new Thread(new ThreadStart(server));
t.IsBackground = true;
t.Start();
ThreadList.Add(t);

//停止
private void button2_Click(object sender, EventArgs e)

foreach (Thread t in ThreadList)

t.Abort();
ThreadList.Remove(t);
break;

private void server()

    UdpClient UDPserver = new UdpClient(123);
    IPEndPoint IP = null;
    try
    
        while (true)
        
           UDPserver.Receive(ref IP);
            bytes = Encoding.UTF8.GetBytes("您好!");
            UDPserver.Send(bytes, bytes.Length,IP);
        
    
    catch (Exception e)
     
     
    finally //确保线程退出时关闭!!
    
        UDPserver.Close();
    

追问

这个我有试过了,不行,可能问题还在线程的结束上。点停止后,再往它发送消息客户端收不到消息,服务端catch里会捉到:“正在终止线程。”再过一段时间,端口就正常了。如果停止后,没有客户端向它发消息,端口就一直没释放。这要怎么处理?

追答

1. 修改线程while循环

   volatile bool flag = true;  //增加标志
    private void server()
   
            UdpClient UDPserver = new UdpClient(123);
            IPEndPoint IP = null;
            try
            
                while (flag) //设置flag = false 则停止循环
                
                    if(UDPserver.Available==0) continue;  //没有数据,继续循环;有数据就接收
                    UDPserver.Receive(ref IP);
                    bytes = Encoding.UTF8.GetBytes("您好!");
                    UDPserver.Send(bytes, bytes.Length,IP);
                
                //关闭
               UDPserver.Close();
            
            catch (Exception e)
            
            
        

2. 不用t.Abort()结束线程,在按钮中事件处理函数中

 private void button2_Click(object sender, EventArgs e)
 
     flag = false;  //只需要这一句!!
 

参考技术A 6L正解

释放 TCP/IP 端口?

【中文标题】释放 TCP/IP 端口?【英文标题】:Freeing up a TCP/IP port? 【发布时间】:2010-10-19 12:48:08 【问题描述】:

netstat -tulnap 显示正在使用的端口。如何在 Linux 中释放端口?

【问题讨论】:

【参考方案1】:

杀死正在监听相关端口的进程。我相信 netstat 会向您显示进程 ID。

【讨论】:

netstat -anp|grep 最后一列有进程【参考方案2】:

我认为唯一的方法是停止打开端口的进程。

【讨论】:

【参考方案3】:

假设您是root 用户,"netstat --programs" 命令将为您提供进程信息。然后,您将不得不终止“违规”进程,该进程很可能会再次启动以惹恼您。

根据您实际尝试实现的目标,该问题的解决方案将根据持有这些端口的进程而有所不同。例如,您可能需要禁用服务(假设它们不需要)或将它们配置为使用不同的端口(如果您确实需要它们但您需要更多的端口)。

【讨论】:

【参考方案4】:

正如其他人所说,您必须终止正在侦听该端口的所有进程。最简单的方法是使用fuser(1) 命令。例如,要查看在端口 80 上侦听 HTTP 请求的所有进程(以 root 身份运行或使用 sudo):

# fuser 80/tcp

如果您想杀死它们,只需添加-k 选项即可。

【讨论】:

我发现向端口发送请求也会清除它(虽然我不是 linux 专家) 在 Debian 上安装 fuser:sudo apt-get install psmisc (bitflop.com/document/107) 它工作了,但我也必须在 CentOs 7 上安装 psmisc (sudo yum install psmisc) kill -9 $(fuser 80/tcp 2&gt;/dev/null)【参考方案5】:

如果你真的想立即终止一个进程,你可以发送一个 KILL 信号而不是一个 TERM 信号(后者是一个停止请求,第一个将立即生效,无需任何清理)。很容易做到:

kill -KILL <pid>

但请注意,根据您要停止的程序,其状态可能会在停止时严重损坏。您通常只想在正常终止不起作用时发送 KILL 信号。我想知道你试图解决的根本问题是什么,以及杀戮是否是正确的解决方案。

【讨论】:

这并没有解决我的 ssh 端口转发问题。 sudo fuser -k Port_Number/tcp 做到了。【参考方案6】:

sudo killall -9 "进程名"

【讨论】:

【参考方案7】:

关闭计算机总是会杀死我的进程。

【讨论】:

很少会关闭服务器。 你拿到“最有趣”的徽章了吗? 无需关闭计算机。 有史以来最好的主意 10/10 与其他一些答案不同,这肯定会起作用【参考方案8】:

您可以使用tcpkilldsniff 包的一部分)来终止您需要的端口上的连接:

sudo tcpkill -9 port PORT_NUMBER

【讨论】:

这只是挂起$ sudo tcpkill -9 port 5432 tcpkill: listening on lxcbr0 [port 5432]【参考方案9】:

要在 Linux 中终止特定端口,请使用以下命令

sudo fuser -k Port_Number/tcp

用你占用的端口替换Port_Number

【讨论】:

这实际上杀死了打开端口的进程,而不是端口本身。【参考方案10】:

在终端类型中:

netstat -anp|grep "port_number"

它将显示端口详细信息。转到最后一列。 它将采用这种格式。例如:- PID/java

然后执行:

kill -9 PID. Worked on Centos5

对于 MAC:

lsof -n -i :'port-number' | grep LISTEN

示例响应:

java   4744 (PID)  test  364u  IP0 asdasdasda   0t0  TCP *:port-number (LISTEN)

然后执行:

kill -9 PID 

在 Macbook 上工作

【讨论】:

显然,如果该端口的 PID 列为空,这将不起作用 ...如果您无权查看进程,就会发生这种情况...尝试sudo netstat 实际查看 PID :) 我试图通过 putty cli 杀死亚马逊 ec2 实例上的一个端口。永远说它没有运行任何进程,但端口(角度应用程序为 4200)仍然打开。这是唯一对我有用的命令。【参考方案11】:

检查所有端口:

netstat -lnp

关闭一个打开的端口:

fuser -k port_no/tcp

例子:

fuser -k 8080/tcp

在这两种情况下,如果需要,您都可以使用sudo 命令。

【讨论】:

注意:fuser 会杀死进程而不是端口。这意味着如果港口陷入困境,它还能工作吗?这不是正确的答案。 复制前两个答案。

以上是关于C# udpclint 端口如何释放?的主要内容,如果未能解决你的问题,请参考以下文章

c# 释放socket 端口

C#如何释放线程

如何在 localhost Windows 上释放我的端口 80?

如何在 localhost Windows 上释放我的端口 80?

如何在 localhost Windows 上释放我的端口 80?

如何在 localhost Windows 上释放我的端口 80?