Как отлаживать сетевые ошибки (в частности, ICMP) - PullRequest
0 голосов
/ 12 февраля 2012

У меня есть приложение типа сервер / клиент, Wireshark показывает, что клиент отправил пакет на сервер, сервер дал ожидаемый ответ, но показывает ошибку недоступности порта назначения ICMP.

Я использую функцию, которая была на сайте MDSN, которая работала для меня раньше.

РЕДАКТИРОВАТЬ: Для обновления я проверил, что пакет отправляется после того, как телефон начал слушать, я попробовал другие порты. Нет исключений для сокетов, так что я просто ищу лучший способ отладки сетевых ошибок.

Есть идеи?

public string Receive()
    {
        string response = "Operation Timeout";



        // We are receiving over an established socket connection
        if (udpSocket != null)
        {
            // Create SocketAsyncEventArgs context object
            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
            socketEventArg.RemoteEndPoint = new DnsEndPoint(SERVER, RECIVEPORT);

            // Setup the buffer to receive the data
            socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);

            // Inline event handler for the Completed event.
            // Note: This even handler was implemented inline in order to make this method self-contained.
            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
            {
                if (e.SocketError == SocketError.Success)
                {
                    // Retrieve the data from the buffer
                    response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                    response = response.Trim('\0');
                }
                else
                {
                    response = e.SocketError.ToString();

                }

                _clientDone.Set();
            });

            // Sets the state of the event to nonsignaled, causing threads to block
            _clientDone.Reset();

            // Make an asynchronous Receive request over the socket
            Debug.WriteLine("Listening now:" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond);
            try
            {
                Debug.WriteLine("No socket exception");
                udpSocket.ReceiveFromAsync(socketEventArg);
            }
            catch (SocketException e)
            {
                Debug.WriteLine(e.SocketErrorCode);
            }

            // Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
            // If no response comes back within this time then proceed
            _clientDone.WaitOne(TIMEOUT_MILLISECONDS);
        }
        else
        {
            response = "Socket is not initialized";
        }

        return response;
    }

1 Ответ

0 голосов
/ 14 февраля 2012

«Порт ICMP недоступен» означает, что к порту, на который вы отправляете, не было приложения.Убедитесь, что ваш sendto() настроен на корректный IP-адрес и номер порта.Также убедитесь, что ваш слушатель вызывает bind() на INADDR_ANY и правильный порт.Распространенная ошибка - забыть преобразовать номер порта в сетевой порядок байтов (big-endian).Смотри htons().

...