Почему асинхронное событие сокета send.completed не вызывается? - PullRequest
0 голосов
/ 05 марта 2019

Попытка отправить запрос на обнаружение uPNP.Надеюсь, что проблема проста.Есть ли причина, по которой SendEvent_Completed не срабатывает?

public void Send() {
  var request = $"M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 1\r\nST: ssdp:all\r\n";
  var requestData = Encoding.UTF8.GetBytes(request);

  var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  socket.SendBufferSize = requestData.Length;

  var sendEvent = new SocketAsyncEventArgs();
  sendEvent.RemoteEndPoint = new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900);
  sendEvent.SetBuffer(requestData, 0, requestData.Length);
  sendEvent.Completed += SendEvent_Completed; ;

  socket.SendToAsync(sendEvent);
}

private void SendEvent_Completed(object sender, SocketAsyncEventArgs e) {
  Console.WriteLine("SendEvent_Completed"); // never called why?!
}

1 Ответ

0 голосов
/ 05 марта 2019

Очевидная причина, по которой он не будет повышен, заключается в том, что SendToAsync возвращает false:

false, если операция ввода-вывода завершена синхронно.В этом случае событие Completed для параметра e не будет вызвано, и объект e, переданный в качестве параметра, может быть проверен сразу после возврата вызова метода для получения результата операции.

Поскольку вы в настоящее время вообще не проверяете это значение, нет никакого способа узнать, будет ли событие возбуждено в вашем текущем коде.

...