C# 更快地绑定套接字

C# 更快地绑定套接字,c#,sockets,C#,Sockets,我有一个后台工作人员,我用它来监听端口 它工作得很好,问题是在我发送数据并断开连接后,如果我再次尝试连接,客户端会给我错误,因为应用程序需要时间重新连接到套接字,错误是: “远程主机拒绝连接” 在下面的代码中,listener.Bind(端点) 如何改进我的应用程序 using System.Net.Sockets; class Program { private static BackgroundWorker worker = new BackgroundWorker();

我有一个后台工作人员,我用它来监听端口
它工作得很好,问题是在我发送数据并断开连接后,如果我再次尝试连接,客户端会给我错误,因为应用程序需要时间重新连接到套接字,错误是: “远程主机拒绝连接”
在下面的代码中,listener.Bind(端点) 如何改进我的应用程序

using System.Net.Sockets;

class Program
{

    private static BackgroundWorker worker = new BackgroundWorker();

    static void Main(string[] args)
    {
        Program P = new Program();

        P.notifyIcon1.Visible = true;
        P.ipaddress = IPAddress.Any;
        P.tcpServer = new TcpServer(P.ipaddress.ToString(), 3001);

        worker.DoWork += worker_DoWork;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        //worker.ProgressChanged += worker_ProgressChanged;
        worker.WorkerReportsProgress = true;
        worker.WorkerSupportsCancellation = true;
        if (!worker.IsBusy) worker.RunWorkerAsync();

        Console.WriteLine("Press ENTER to exit the server.");
        Console.ReadLine();
    }


    static void worker_DoWork(object sender, DoWorkEventArgs e)
    {
         IPEndPoint endPoint;
        Socket tcpClient;
        Socket listener;
        int pendingConnectionQueueSize;
        IPAddress ipaddress = IPAddress.Any;

        endPoint = new IPEndPoint(ipaddress, 3001);

        pendingConnectionQueueSize = 100;
        listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        listener.Bind(endPoint);
        listener.Listen(pendingConnectionQueueSize);

        Console.WriteLine("conn..");
        byte[] receiveBuffer = new byte[4096];
        tcpClient = listener.Accept();
        tcpClient.RemoteEndPoint.ToString();

       while ((rc = tcpClient.Receive(receiveBuffer)) > 0)
        {               
             string msg = Encoding.ASCII.GetString(receiveBuffer);    
             Console.WriteLine(msg.Trim());
        }
        listener.Shutdown(SocketShutdown.Both);
        listener.Close();
    }
    static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (!worker.IsBusy) worker.RunWorkerAsync();//restart    
    }

}       

为什么要启动然后停止服务器?为什么你不能让它一直运行呢?我试过了,我做了一个“while(true)”,但即使在这里,我从客户端断开连接后,它也无法再次连接。你需要保持你的侦听器打开,并且在你想退出主线程之前不要关闭它。您需要一个线程来处理每个客户端连接。主线程在接受时阻塞-等待连接。因此,您应该围绕accept循环您的主线程—有很多这样的例子。如果客户端发送大量数据,那么您会发现使用WriteLine()滚动控制台的速度非常慢。应该是容易看到的,通过注释来确定是否有区别。下一步是暂时禁用反恶意软件。如果代码中出现异常(如您所说,您的侦听器未被释放。请使用
using(var listener=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);{……在此处插入代码……}