Использование сокета C# в обе стороны - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть простая C# Windows Presentation Framework программа, которая порождает TCP Listener. Этот прослушиватель TCP принимает сокет от соединения, которое я затем хочу иметь возможность получать и отправлять данные.

Я не был уверен, как это сделать с тем же сокетом, поэтому я настроил этот l oop.

По существу в начале каждого l oop, проверка с таймаутом (я думаю, 10 мс) для новых данных, затем независимо от новых данных, продолжающих посылать данные, если применимо. Если бы у меня не было тайм-аута, я бы не смог отправить данные без предварительного получения данных, так как вызов socket.recieve заблокировал бы, пока у нас не было чего-либо.

Однако этот тайм-аут вызывает ужасную задержку в моем приложении. Несмотря на работу в другом кадре! Из тестирования, как только я убираю тайм-аут, задержка исчезает. Так что я совершенно уверен, что в этом проблема.

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

    System.Net.IPAddress localAddr = System.Net.IPAddress.Parse("127.0.0.1);
    TcpListener mListener = new TcpListener(localAddr, 5000);
    var thread = new System.ThreadingThread(() => {
        mListener.Start();

        //Loop Forever
        mListener.Start();

        while(true){

           Socket client = mListener.AcceptSocket();

               client.ReceiveTimeout = 10;

                while(true){
            byte[] data = new byte[5000];       

            int returnsize = 0;
            try{
                  returnSize = client.Recieve(data);
            }catch(Exception e){
              //Client Timeout!
                  //We will catch a data on the next loop
            }

            //now here I would check here if a queue has data to send
            //if so use client.send

            //proceed to next loop
            }

        }

    });
thread.Start();

Спасибо за помощь!

...