Проблема с сокетом Monotouch

#c# #ios #xamarin.ios

#c# #iOS #xamarin.ios

Вопрос:

BeginSend функция не выдает исключение, когда я отключаю iPad от сети. Интересно то, что OnSend функция обратного вызова вызывает и результат. Iscompleted возвращает true.

Если я вызываю другую перегруженную функцию с кодом ошибки, она всегда возвращает success

 tcpAsyCl.BeginSend(
             write_data, 
             0, 
             write_data.Length, 
             SocketFlags.None, 
             out error, 
             new AsyncCallback(OnSend), 
             null);

if (error != SocketError.Success)
      throw new Exception("Not connected"); //never goes her
  

Кто-нибудь знает такое поведение?

Ответ №1:

поскольку это асинхронный вызов! Вы не можете проверить результат в строке ниже… Я уверен, что у вас есть метод, который вы можете подключить, чтобы получить правильную ошибку.

Асинхронные вызовы создаются в новом потоке, и именно там вам нужно дождаться ответа. Не в вашем основном потоке, иначе это был бы Синхронный вызов.

вот список всех методов, которые вы можете использовать

Я бы настоятельно рекомендовал вам внимательно ознакомиться с этим документом

Использование асинхронного клиентского сокета

Комментарии:

1. Когда я использую эту форму, она никогда не выдает исключение. tcpAsyCl.BeginSend(write_data, 0, write_data. Длина, SocketFlags. Нет, новый обратный вызов AsyncCallback (OnSend), null); Но в Windows он выдает исключение, когда netwrok недоступен. В iOS я не могу исправить статус disconnected.

2. все ваши ошибки будут в OnSend обратном вызове, поскольку именно там вы указываете методу Async возвращать информацию, вы можете использовать делегат вместо метода. Смотрите ссылку на обновленный ответ.

3. Добавьте связанный документ со всем кодом и объяснениями, которые вам нужны для использования System.Net.Sockets в асинхронном вызове

4. Я пробовал эти методы, но мне это не помогло. Когда я отключаю устройство от сети, оно продолжает отправлять данные в клиент OnSend. EndSend (результат) возвращает 14 байт за время отключения.