如何关闭C#TCP套接字?

时间:2016-12-19 22:26:05

标签: c# sockets tcp

我是C#和Socket编程的新手,虽然我有多年的其他语言编程经验。

概述:我们的生产服务器在特定TCP端口上接收消息。在系统升级期间,我们的接口团队负责关闭到端口的消息。他们通过他们的界面引擎软件执行此任务。我们的团队无法访问此软件。不幸的是,有时接口团队会告诉我们接口没有关闭,并且在我们开始系统升级后应用程序消息仍然到达。这会导致很大的问题。因此,我们希望开发一种工具来显示特定端口上的侦听和活动TCP连接,并提供关闭相关套接字的功能。我理解如何对我创建的套接字使用Shutdown()和Close()方法,但不知道如何关闭由另一个进程创建的套接字。

“Currports”是一款商业软件,可以满足我们的需求,但我被告知,我们无法在生产环境中安装它。

我的建议只是使用netstat和Powershell来识别端口,然后通知我们的界面团队完成他们的工作。但是,我的老板想要一个更优雅的解决方案。此外,接口团队可能已经离开了当天,如果没有访问接口引擎软件,我们将无法停止接口。

注释/问题:

  1. 我可以以管理员或运行应用程序界面侦听器的同一用户身份运行我的软件。
  2. 哪些C#类和方法可用于关闭和关闭由另一个进程创建的套接字?操作系统是否允许我这样做,假设我是以管理员身份运行或者是创建套接字的同一用户?
  3. 即使我可以关闭侦听端口的套接字,那么活动连接呢?我知道正在侦听传入消息的已定义端口;但是,一旦建立连接,它不会在不同的端口上吗?我如何知道已建立的TCP连接是否与我关注的接口应用程序相关联?
  4. 感谢您的帮助。请不要因为我对C#和网络编程的有限知识而尽我所能。

    下面提供的代码显示了返回TCP侦听器和活动连接列表的C#代码。我想获取这些方法的结果,并能够关闭,关闭或终止相关的套接字。是的,我知道我在我脑海中,但这是我老板给我的任务。注意:基于我发布此内容后的其他研究,看起来我唯一的选择可能是杀死与套接字关联的进程。如果是这样,我怎么能通过C#来做到这一点?

    namespace TCPLibrary
    {
        public class TCPWrapper
        {
            // Return a List of active TCP Listeners
            public List<String> ShowActiveTcpListeners()
            {
                List<String> tcpActiveListen = new List<String>();
    
                IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
                IPEndPoint[] endPoints = properties.GetActiveTcpListeners();
                foreach (IPEndPoint e in endPoints)
                {
                    tcpActiveListen.Add(e.ToString());
                }
                return tcpActiveListen;
            }
    
            // Return a List of active TCP Connections
            public List<String> ShowActiveTcpConnections()
            {
                List<String> tcpActiveConn = new List<String>();
                IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
                TcpConnectionInformation[] connections = properties.GetActiveTcpConnections();
                foreach (TcpConnectionInformation c in connections)
                {
                    //tcpActiveConn.Add("Local Endpoint: " + c.LocalEndPoint.ToString() + "  Remote Endpoint: " + c.RemoteEndPoint.ToString() + "  State: " + c.State);
                    tcpActiveConn.Add("Local Endpoint: " + c.LocalEndPoint.ToString() + " State: " + c.State);
                }
                return tcpActiveConn;
            }
        }
    }
    

0 个答案:

没有答案