C# Методы TcpClient Begin / End - PullRequest
       34

C# Методы TcpClient Begin / End

0 голосов
/ 09 марта 2020

Я пытаюсь лучше понять C# классы сокетов. Я работаю с объектом TcpClient. Я использую его в проекте Unity (разработка игр), поэтому я не могу заблокировать основной поток. Я хотел бы использовать метод с формой Begin / End, как, например, BeginConnect () и EndConnect ().

Я делаю это:

public class TcpTest : MonoBehaviour
{
     private TcpClient m_TcpClient = null;

     private void Start()
     {
          m_TcpClient = new TcpClient();
          m_TcpClient.BeginConnect("127.0.0.1", 40000, OnConnectAsyncCallback, null);
     }

     private void OnConnectAsyncCallback(IAsyncResult i_AsyncResult)
     {
          m_TcpClient.EndConnect(i_AsyncResult);

          MyAsyncDebug.Log("Connect callback received.");
     }
}

Я использую hercules как инструмент для отладки сокетов. Я запустил TCP-сервер с ним, и все было хорошо. Затем я остановил TCP-сервер на Hercules. Я перезапустил свой код и ожидал ошибку или исключение. Ничего, код просто запускает BeginConnect () и AsyncCallback больше не вызывается. Я также пытался запустить сервер после того, как был вызван метод BeginConnect, но он не работает.

Как узнать, произошел ли сбой в Begin Connect (возможно, пункт назначения недоступен или по какой-либо другой причине)?

Я не могу понять, как они устроены (я уже читал документы MSDN).

Спасибо и извините за новый ie вопрос!

1 Ответ

0 голосов
/ 10 марта 2020

TcpClient не имеет свойства для установки времени ожидания соединения. Существуют свойства для отправки и получения, но не для подключения. Один из распространенных способов ожидания истечения времени ожидания соединения - это ожидание IAsyncResult от BeginConnect или использование ConnectAsyn c

IAsyncResult ar = client.BeginConnect("host", port, null, null);
var success = ar.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(60));

ИЛИ

var client = new TcpClient();
if (!client.ConnectAsync("host", port).Wait(60))

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

...