C# 解决Socket/TCPServer监听端口释放失败的问题

这篇具有很好参考价值的文章主要介绍了C# 解决Socket/TCPServer监听端口释放失败的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

现象

使用Socket建立了TCPServer开启监听后,关闭连接无法成功。

亦或是关闭连接后,二次创建仍显示端口占用问题。


原因以及方法:

①可能是数据流还在传输,导致TCPServer无法关闭。不能直接调用Close()方法。
proxsocket.Close(100);//参数内是允许数据再传输100ms

解决方法:在关闭前,结束全部数据流的传输,再Close,即可成功关闭监听,释放监听端口。

public void StopServerConnet(Socket proxsocket)//关闭连接
{
    try
    {
        proxsocket.Shutdown(SocketShutdown.Both);//禁用某 Socket 上的发送和接收。
    }
    catch (Exception)
    {

    }
    finally
    {
        proxsocket.Close(100);
        proxsocket.Dispose();
    }

}

注意:假如在ShutDonw的时候Catch到了错误,证明禁用失败,已经是其他的问题,此时Close也无济于事。请看原因2。

②在有Client断开连接的时候,Server没有主动去再去断开一次Client。

假如你Server存在一个或多个Client连接,在接收消息方法体内应该监听Client连接情况并且做出相应处理。假如在Client断开时没有做主动断开的处理,就只是结束此方法线程,端口也将无法释放。

错误示范

    var ProxSocket = socket as Socket;
    byte[] data = new byte[1024 * 1024];//接收消息的缓冲区
    while (true)
    {
        int len = 0;//记录消息长度
        try
        {
            len = ProxSocket.Receive(data, 0, data.Length, SocketFlags.None);//此处接收Client的连接

        }
        catch (Exception)
        {
            //假如Client异常退出
            return;//让方法结束,终结当前接收服务端数据的异步线程
        }
        if (len <= 0)
        {
            //如果小于0,证明无连接,CLient正常退出
            return;//让方法结束,终结当前接收服务端数据的异步线程
        }

        //接收到的消息处理
        //…………

    }
    return;

解决方法:在Client异常退出和正常退出时,都要主动去断开Client的连接,后续监听端口就才能正确释放。

正确示范:

public void ReceiveData(object socket)//TCPServer接收消息的方法
{
    var ProxSocket = socket as Socket;
    byte[] data = new byte[1024 * 1024];//接收消息的缓冲区
    while (true)
    {
        int len = 0;//记录消息长度
        try
        {
            len = ProxSocket.Receive(data, 0, data.Length, SocketFlags.None);//此处接收Client的连接

        }
        catch (Exception)
        {
            //假如Client异常退出

            //应该关闭此Client连接
            ps.StopServerConnet(ProxSocket);

            return;//让方法结束,终结当前接收服务端数据的异步线程
        }
        if (len <= 0)
        {
            //如果小于0,证明无连接,CLient正常退出

            //应该关闭此Client连接
            ps.StopServerConnet(ProxSocket);

            return;//让方法结束,终结当前接收服务端数据的异步线程
        }

        //接收到的消息处理
        //…………

    }
    return;
}

关闭Client连接方法与原因①的解决方法一样。

③监听方法开启子线程时没有设置为背景线程,子线程在应用结束时没有结束。

假如在开启监听线程时,只是start,没有设置为背景线程,不仅会阻塞主线程,而且有可能会使应用退出后仍会占用端口。

错误示范:

//1实例化socket类,寻址方式,类型,协议。
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
//2实例化端口号
IPEndPoint ip = new IPEndPoint(IPAddress.Any,int.Parse(PortTxt));
//3绑定端口号
try
{
    socket.Bind(ip);
    //4开启监听
    socket.Listen(10);
    //5开始接受客户端连接
    Thread thread=new Thread(new ParameterizedThreadStart(AcceptClientConnet));//持续监听客户端连接方法
    thread.Start(socket);

}
catch (Exception)
{

}

正确示范:

//1实例化socket类,寻址方式,类型,协议。
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
//2实例化端口号
IPEndPoint ip = new IPEndPoint(IPAddress.Any,int.Parse(PortTxt));
//3绑定端口号
try
{
    socket.Bind(ip);
    //4开启监听
    socket.Listen(10);
    //5开始接受客户端连接
    Thread thread=new Thread(new ParameterizedThreadStart(AcceptClientConnet));//持续监听客户端连接方法

    thread.IsBackground=true;//设置为背景线程

    thread.Start(socket);

}
catch (Exception)
{

}

总结

无非就是记得关闭数据流,关闭Client连接,设置背景线程。都是细节。细节往往决定成败啊,我被第二个原因卡了几个星期了才发现。希望能帮到大家。文章来源地址https://www.toymoban.com/news/detail-418951.html

到了这里,关于C# 解决Socket/TCPServer监听端口释放失败的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 工作随记2:Linux更改SSH端口,并解决SSHD服务重启失败的问题

    环境:Linux Centos 7 1.进入sshd配置文件:  2、找到“#Port 22”这行,删掉注释符#,将端口改为2022: 3.重启sshd服务: 可能会出现以下报错内容: Job for sshd.service failed because the control process exited with error code.See \\\"systemctI status sshd.service\\\" and \\\"journalctI -xe\\\" for details. 原因是SELinux(Lin

    2024年02月13日
    浏览(35)
  • c#写的端口监听,程序退出后,再次运行提示端口占用,且进程不存在

    我用c#写了一个监听29999端口,进程结束后再次启动发现端口被占用,但是运行netstat -ano | findstr 29999找到进程ID后,却没有这个进程  经查询这个监听29999进程虽然没了,但是要找到他的父进程,把父进程关闭了才可以,参考下面的例子 In the first place, you must find the process that i

    2024年02月11日
    浏览(46)
  • Vue连接WebSocket后,监听消息并读取消息内容(onmessage事件),解决将内容赋值到data的属性失败的问题

    技术栈 前端Vue (包括一些组件、中间件) 后端分布式微服务 这里就不再详述后端是怎么开发通信服务端的了,因为我主要是后端开发,前端开发花的时间几乎是后端的两倍还要多( 其实比较简单,只是自己前端真的不得行 🤪) 最近在开发项目里的一个IM(实时通信)模块

    2023年04月22日
    浏览(38)
  • C# Socket通信从入门到精通(16)——单个同步UDP服务器监听多个客户端C#代码实现

    我们在开发UDP通信程序时,有时候我们也需要开发UDP服务器程序,这个服务器只需要和一个客户端实现通信,比如这篇博文C# Socket通信从入门到精通(15)——单个同步UDP服务器监听一个客户端C#代码实现,但是在实际项目中有的时候需要和多个客户端进行通信,这时和一个客

    2024年01月22日
    浏览(58)
  • C# Socket通信从入门到精通(15)——单个同步UDP服务器监听一个客户端C#代码实现

    我们在开发UDP通信程序时,除了开发UDP客户端程序,有时候我们也需要开发UDP服务器程序,这在实际项目中是经常会遇到的,所以说掌握UDP服务器程序的开发是一项必备的技能,尤其在上位机软件开发领域,掌握UDP服务器程序的开发是走向高级工程师的必经之路,也是面试必

    2024年02月03日
    浏览(54)
  • 解决问题:关于云服务器Linux在windows中telnet访问无法打开到主机的连接。 在端口 23: 连接失败的问题

    在本地先开启windows服务的telnet,在windows使用telnet 127.0.0.1 测试telnet服务是否启用 出现下面的即为可用 账号为本机的账户名在cmd中输入whoami即可得到,密码为自己开机密码 使用telnet测试是否能连接到服务器 在服务器端使用命令查看正在运行的端口 在服务器使用telnet 127.0.0.

    2024年02月10日
    浏览(46)
  • c#向c++(opencv)实现双向图像数据传递,以及内存空间申请与释放问题

    c++与c#之间对应的数据关系: https://blog.csdn.net/qq_44544908/article/details/128784250 c++转换到c#的辅助工具(推荐,可以自动按照输入的c++代码函数或结构体转换为c#代码段): https://codeload.github.com/jaredpar/pinvoke-interop-assistant/zip/refs/heads/master 数据转换的基本依据: 一个数据有两个特征:

    2024年02月12日
    浏览(41)
  • 最新kali关于无线网卡监听失败扫描不到wifi的解决方法

    在进行wifi监听时,出现监听不到WiFi的一些解决方法。 将网卡拔掉换个插口,重启物理主机并重启虚拟机! 输入命令检查进程并杀掉进程。 需要执行命令先卸载网卡,再重新挂载,按顺序执行下面三条代码。 此网卡就是wlan0,不是wlan0mon。也不需要用airmon-ng start 命令启用监

    2024年02月16日
    浏览(49)
  • Linux 下查看端口以及释放端口

    目录 一、查看端口是否被占用 1、使用 `netstat` 命令 2、使用 `lsof` 命令 二、释放端口 1、使用kill命令 2、使用 fuser 命令 三、netstat 四、lsof 五、fuser         在 Linux 系统上,你可以使用 `netstat` 或 `lsof` 命令来查看端口是否被占用。以下是两种方法: 这将显示占用指定端口

    2024年04月09日
    浏览(35)
  • Linux文件已删除后,解决磁盘空间不释放的问题

    1、错误现象 运维的监控系统发来通知,报告一台服务器空间满了,登录服务器查看,根分区确实没有空间了: 这里首先说明一下服务器的一些删除策略,由于Linux没有回收站功能,所以线上服务器上所有要删除的文件都会先移动到系统/tmp目录下,然后定期清除/tmp目录下的数

    2024年01月18日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包