在我的应用程序关闭后,端口仍在被监听,这是不是很糟糕

本文关键字:监听 是不是 应用程序 我的 | 更新日期: 2023-09-27 18:19:44

我的应用程序在某个端口上侦听套接字消息。我可以通过命令行的"netstat-a"看到它正在侦听。

当我关闭应用程序时,当我重新运行"netstat-a"时,机器仍在监听该端口

这是个问题吗?

似乎是这样,当我随后再次启动该应用程序时,它不光彩地崩溃了。

我怎样才能使倾听停止?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Diagnostics;
namespace testSocketSendAndReceive_Nutshell
{
    public partial class Form1 : Form
    {
        string sJerrysIPAddr = "10.24.93.110";
        string sMyIPAddr = "10.24.93.128";
        string sThisAppFileName = string.Empty;
        bool bThisInstanceFunctionsAsServer = false;
        internal static Form1 MainSocketPairForm = null;
        public Form1()
        {
            InitializeComponent();
            MainSocketPairForm = this;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            sThisAppFileName = System.Diagnostics.Process.GetCurrentProcess().ProcessName; // This provides just the app name, appending ".vshost" but NOT ".exe" (testSocketSendAndReceive_Nutshell.vshost)
            lblFileName.Text = sThisAppFileName;
            // Client and Server code are here combined in one app; however, we want each instance to run as
            // just one or the other, so (the .exe functioning as a Server should be renamed with the subString
            // "Server" somewhere in the filename):
            bThisInstanceFunctionsAsServer = sThisAppFileName.Contains("Server");
            if (bThisInstanceFunctionsAsServer)
            {
                new Thread(Server).Start();       // Run server method concurrently.
                Thread.Sleep(500);                // Give server time to start.
            }
            btnSendMsg.Visible = !bThisInstanceFunctionsAsServer;
            textBox1.Visible = !bThisInstanceFunctionsAsServer;
        }
        static void Client()
        {
            using (TcpClient client = new TcpClient(Form1.MainSocketPairForm.sJerrysIPAddr, 51111)) // err here second time around
            using (NetworkStream n = client.GetStream())
            {
                BinaryWriter w = new BinaryWriter(n);
                w.Write(Form1.MainSocketPairForm.textBox1.Text.ToString());
                w.Flush();
                Form1.MainSocketPairForm.label1.Text = new BinaryReader(n).ReadString();
            }
        }
        static void Server()     
        {
            TcpListener listener = new TcpListener(IPAddress.Any, 51111);
            listener.Start();
            var shouldExit = false;
            while (!shouldExit)
                using (TcpClient c = listener.AcceptTcpClient())
                {
                    using (NetworkStream n = c.GetStream())
                    {
                        string msg = new BinaryReader(n).ReadString();
                        if (msg == "exit")
                            // Client told us to exit... 
                            shouldExit = true;
                        BinaryWriter w = new BinaryWriter(n);
                        w.Write(msg + " back atcha!");
                        w.Flush(); // Must call Flush because we're not disposing the writer. 
                    }
                }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Client();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}

在我的应用程序关闭后,端口仍在被监听,这是不是很糟糕

您的应用程序可能实际上并没有退出(检查.exe的任务管理器"进程"选项卡)。

您可能正试图通过关闭命令窗口来关闭应用程序。因为您的服务器线程不是后台线程,所以它将继续运行。试试Form_Load:中的这个家伙

if (bThisInstanceFunctionsAsServer)
        {
            var serverThread = new Thread(Server);
            serverThread.IsBackground = true; // Make sure the server thread doesn't keep the app running in the background
            serverThread.Start();       // Run server method concurrently.
            Thread.Sleep(500);                // Give server time to start.
        }