Недопустимый аргумент был предоставлен исключение сокета при запуске приложения с общего диска - PullRequest
0 голосов
/ 16 мая 2018

Live было хорошо до недавнего (май 2018 г.) обновления Windows 10. Мое приложение .NET, которое работало в течение многих лет (5+) с общего диска, начало выдавать исключение «Указан неверный аргумент» при попытке выполнить любую сетевую операцию (загрузить файл через http или подключиться к веб-службе).

Я погуглил проблему, но все решения относятся к 2012 году, и они больше не применяются. Кто-нибудь знает, как это исправить?

PS: я подтвердил, что проблема в общем диске (нет проблем, когда я перемещаю приложение в локальную папку). Это как-то связано с безопасностью .NET

1 Ответ

0 голосов
/ 22 мая 2018

Я испытал нечто подобное, я полагаю. После установки последнего обновления Windows (май 2018 г.) метод аутентификации, используемый в написанном мною приложении WPF, больше не работает.

Я нашел два способа заставить его работать снова:

  1. Откат к предыдущей версии Windows
  2. Скопируйте файл приложения .exe в локальный каталог (например, Desktop)

Это не решение, а обходной путь, который сработал для моих нужд.

Исключение:

System.Net.SocketException (0x80004005): указан неверный аргумент в System.Net.Sockets.TcpClient..ctor (Строковое имя хоста, порт Int32) [...]

И метод Authenticate() в приложении следующий (исключение выдается в строке конструктора new TcpClient):

    public static int Authenticate(string IPAddress, int port, string appInfo, ref string answerStr)
    {
        var encryptor = new Crypto();

        var xClient = new TcpClient(IPAddress, port);
        var xStream = xClient.GetStream();

        IPHostEntry ipEntry = Dns.GetHostEntry(Environment.MachineName);
        IPAddress[] addr = null;
        var localIP = "";
        addr = ipEntry.AddressList;

        foreach (IPAddress xAddr in addr)
        {
            if ((xAddr.AddressFamily == AddressFamily.InterNetwork))
            {
                localIP = xAddr.ToString();
                break;
            }
        }

        // Send auth request
        string authStr = $"{DateTime.Now.ToString()}|{Environment.UserName}|{Environment.UserDomainName}|{Environment.MachineName}|{localIP}|{appInfo}";
        byte[] authSocket = encryptor.Crypt(authStr);
        Array.Resize(ref authSocket, xClient.SendBufferSize);
        xStream.Write(authSocket, 0, authSocket.Length);

        // Read auth answer
        byte[] answerSocket = new byte[xClient.ReceiveBufferSize];
        xStream.Read(answerSocket, 0, answerSocket.Length);
        answerStr = encryptor.DeCrypt(answerSocket);

        if (!answerStr.ToUpper().StartsWith("Permission denied"))
        {
            var role = -1;
            var roleStr = answerStr.Split('|')[0];
            Int32.TryParse(roleStr, out role);

            answerStr = answerStr.StripBegin(roleStr + "|");

            return role;
        }
        else
            return -1;
    }

Надеюсь, это поможет решить проблему.

...