C# TCPClient SocketError 10051 во время операции чтения. Адаптеры IP пустые - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть приложение, которое использует TCPClient для подключения к TCPServer и обмена данными каждые 300 мс. Приложение и соединения работают как положено. Я проверил соединение в течение 2 дней и все время работает без ошибок. Сегодня я получил ошибку, которую я не могу решить и которую я не понимаю. Компьютер (TCPClient) и TCPServer находятся в одной сети, и оба получают свои IP-адреса через DHCP. Приложение начинается с чтения информации о сетевом адаптере и считывает IP-адрес сетевых адаптеров и другую информацию:

NetworkInterface[] adapter = NetworkInterface.GetAllNetworkInterfaces();

На компьютере обнаружено два адаптера, следующий код доставляет IP-адреса:

foreach (UnicastIPAddressInformation ip in adapter.GetIPProperties().UnicastAddresses)
{
   if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
   {
      this.ip = ip.Address.ToString();
      this.mask = ip.IPv4Mask.ToString();
   }
}

Адаптер один: IP: 192.168.0.153, Маска: 255.255.255.0 Адаптер два: IP: 127.0.0.1, Маска: 255.0.0.0 (псевдоинтерфейс имени петли1)

Я знаю IP-адрес моего сервера и начать подключаться.

controller = new TcpClient();
controller.Connect(192.168.0.0, 5001);
.... //Continues when controller.Connected == true
static NetworkStream ns_controller = controller.GetStream();
ns_controller.WriteTimeout = 100;
ns_controller.ReadTimeout = 10;

После этого мое приложение записывало и считывало данные из сетевого потока в течение 800 секунд. Затем новые инструкции чтения заканчиваются в блоке перехвата:

try
{
   byte[] r = new byte[100];
   int anz = 0;
   anz = ns_controller.Read(r, 0, r.Length);
}
catch (Exception ex)
{
   //Output of the inner exception data and reset of communication
}

InnerException.ErrorCode: 10051 и InnerException.Message: операция с сокетом относится к недоступной сети

Когда я сбрасываю связь, потому что после ошибки сетевые адаптеры читаются через 100 мс после исключения снова с тем же кодом, что и в начале. Разница лишь в том, что IP-адрес и маска сети теперь "" пусты. После этого я закрыл заявку и попробовал снова. IP-адрес сетевого интерфейса снова был 192.168.0.153 и не изменился.

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

Я знаю, что не могу предоставить всю информацию, но надеюсь, что этого достаточно. Проблема в том, что предоставленная информация - все, что я записал в своем протоколе. Я не смог снова вызвать ошибку в другой раз, чтобы записать полную информацию. Любая помощь или подсказка приветствуется.

1 Ответ

0 голосов
/ 02 мая 2020

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

Добавьте еще один блок catch, используя ScoketExeption с все возможные ошибки сокетов

  try
    {
            //Your code .................
            Socket socket = controller.Client; // not necessary to use but could be helpful to gracefully close the socket and for retry connection in catch( ) e.g. if(socket!=null) socket.close();  
            // your code..................

        }
        catch(SocketException se)
        {
        string exception = string.Empty;
        switch (se.SocketErrorCode)
        {
            case SocketError.Success:
                exception = "Success";
                break;
            case SocketError.SocketError:
                exception = "Socket Error";
                break;
            case SocketError.Interrupted:
                exception = "Socket Interrupted";
                break;
            case SocketError.AccessDenied:
                exception = "Access Denied";
                break;
            case SocketError.Fault:
                exception = "Socket Falut";
                break;
            case SocketError.InvalidArgument:
                exception = "Invalid Argument";
                break;
            case SocketError.TooManyOpenSockets:
                exception = "Too Many Open Sockets";
                break;
            case SocketError.WouldBlock:
                exception = "Socket Blocked";
                break;
            case SocketError.InProgress:
                exception = "In progress";
                break;
            case SocketError.AlreadyInProgress:
                exception = "Already in progress";
                break;
            case SocketError.NotSocket:
                exception = "Not Socket";
                break;
            case SocketError.DestinationAddressRequired:
                exception = "Destination Address Required";
                break;
            case SocketError.MessageSize:
                exception = "Message Size Error";
                break;
            case SocketError.ProtocolType:
                exception = "Protocol Type Error";
                break;
            case SocketError.ProtocolOption:
                exception = "Protocol Option Error";
                break;
            case SocketError.ProtocolNotSupported:
                exception = "Protocol Not Supported";
                break;
            case SocketError.SocketNotSupported:
                exception = "Socket Not Supported";
                break;
            case SocketError.OperationNotSupported:
                exception = "Operation Not Supported";
                break;
            case SocketError.ProtocolFamilyNotSupported:
                exception = "Protocol Family Not Supported";
                break;
            case SocketError.AddressFamilyNotSupported:
                exception = "Address Family Not Supported";
                break;
            case SocketError.AddressAlreadyInUse:
                exception = "Adreess Already In Use";
                break;
            case SocketError.AddressNotAvailable:
                exception = "Address Not Avaialble";
                break;
            case SocketError.NetworkDown:
                exception = "Network Down";
                break;
            case SocketError.NetworkUnreachable:
                exception = "Network Unreachable";
                break;
            case SocketError.NetworkReset:
                exception = "Network Reset";
                break;
            case SocketError.ConnectionAborted:
                exception = "Connection Aborted";
                break;
            case SocketError.ConnectionReset:
                exception = "Connection Reset";
                break;
            case SocketError.NoBufferSpaceAvailable:
                exception = "No Buffer Space Available";
                break;
            case SocketError.IsConnected:
                exception = "Connected";
                break;
            case SocketError.NotConnected:
                exception = "Not Connected";
                break;
            case SocketError.Shutdown:
                exception = "Shutdown";
                break;
            case SocketError.TimedOut:
                exception = "Timed Out";
                break;
            case SocketError.ConnectionRefused:
                exception = "Connection Refused";
                break;
            case SocketError.HostDown:
                exception = "Host Down";
                break;
            case SocketError.HostUnreachable:
                exception = "Host Unreachable";
                break;
            case SocketError.ProcessLimit:
                exception = "Process Limit";
                break;
            case SocketError.SystemNotReady:
                exception = "System Not Ready";
                break;
            case SocketError.VersionNotSupported:
                exception = "Version Not Supported";
                break;
            case SocketError.NotInitialized:
                exception = "Not Initialized";
                break;
            case SocketError.Disconnecting:
                exception = "Disconnecting";
                break;
            case SocketError.TypeNotFound:
                exception = "Type Not Found";
                break;
            case SocketError.HostNotFound:
                exception = "Host Not Found";
                break;
            case SocketError.TryAgain:
                exception = "Try Again";
                break;
            case SocketError.NoRecovery:
                exception = "No Recovery";
                break;
            case SocketError.NoData:
                exception = "No Data";
                break;
            case SocketError.IOPending:
                exception = "IO Pending";
                break;
            case SocketError.OperationAborted:
                exception = "Operation Aborted";
                break;
            default:
                exception = "Un Specified Error";
                break;
        }
    }
...