Я испытал нечто подобное, я полагаю. После установки последнего обновления Windows (май 2018 г.) метод аутентификации, используемый в написанном мною приложении WPF, больше не работает.
Я нашел два способа заставить его работать снова:
- Откат к предыдущей версии Windows
- Скопируйте файл приложения .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;
}
Надеюсь, это поможет решить проблему.