сокет останавливается после первого приема - PullRequest
2 голосов
/ 17 февраля 2020

У меня есть BackGroundWorker, который я использую для прослушивания через порт
Он работает довольно хорошо, проблема в том, что после первого приема он перестает работать, я попытался с " while (true)"и перезапустите его в событии RunWorkerComplete , но безуспешно
С помощью stopPoints я вижу, что он выполняет console.writeline () с правильным сообщением, затем он перестает работать

    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 (true)
        {
            int rc = tcpClient.Receive(receiveBuffer);
             string msg = Encoding.ASCII.GetString(receiveBuffer);

            if (rc == 0)
                break;

            Console.WriteLine(msg.Trim());
        }

        listener.Close();
    }
    static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (!worker.IsBusy) worker.RunWorkerAsync();//restart

    }

}       

1 Ответ

2 голосов
/ 17 февраля 2020

затем он перестает работать

Показанный код работает и читает столько раз, сколько доступны данные; Я протестировал его с te lnet, и он работал нормально (i sh - все еще есть некоторые ошибки в ASCII-декодировании буфера, как обсуждалось в комментариях)!

Если он читает только один раз тогда я могу только предположить, что ваш клиент не отправляет больше данных по тому же соединению . Показанный код принимает только одно соединение, а затем читает его до конца.

...