Я пытаюсь отправить несколько байтов через соединение Socket на сервер, используя TLS 1.2 и самозаверяющие сертификаты в приложении UWP.
Я пытаюсь использовать приведенный ниже код, но получаю ошибку: Информация WinRT: Тайм-аут операции при выполнении строки webSocket.ConnectAsync.
С Wireshark я вижу, что TLS-рукопожатие инициируется с правильным IP-адресом и номером порта.
private static MessageWebSocket messageWebSocket;
private static DataWriter messageWriter;
public static async Task<bool> SocketControl()
{
try
{
//creates a new MessageWebSocket and connects to WebSocket server and sends data to server
//Make a local copy
MessageWebSocket webSocket = messageWebSocket;
//Have we connected yet?
if (webSocket == null)
{
Uri myUri = new Uri("wss://192.168.0.135:51200");
webSocket = new MessageWebSocket();
webSocket.Control.MessageType = SocketMessageType.Binary;
webSocket.MessageReceived += MessageReceived;
webSocket.Closed += Closed;
webSocket.Control.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted);
webSocket.Control.IgnorableServerCertificateErrors.Add(ChainValidationResult.InvalidName);
await webSocket.ConnectAsync(myUri); // Times out here, Output=WinRT information: The operation timed out
messageWebSocket = webSocket;
messageWriter = new DataWriter(webSocket.OutputStream);
}
messageWriter.WriteBytes(new byte[] {0, 1});
await messageWriter.StoreAsync();
}
catch (Exception ex)
{
String.Format("There is an error in connection");
}
return true;
}
//Sends the data
private static void MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
{
try
{
using (DataReader reader = args.GetDataReader())
{
//reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
//string read = reader.ReadString(reader.UnconsumedBufferLength);
//var read = reader.ReadBytes();// .ReadString(reader.UnconsumedBufferLength);
var read = reader.ReadByte();
}
}
catch (Exception ex)
{
String.Format("There is an error sending the data");
}
}
// Close connection
private static void Closed(IWebSocket sender, WebSocketClosedEventArgs args)
{
MessageWebSocket webSocket = Interlocked.Exchange(ref messageWebSocket, null);
if (webSocket != null)
{
webSocket.Dispose();
}
}
У меня есть пример скрипта на Python, который работает без проблем, я просто хочу сделать то же самое в c #
Часть скрипта Python выглядит так:
def main():
sock = socket.socket(socket.AF_INET)
sock.settimeout(10.0)
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
context.check_hostname = False
#accept self-signed certificate
context.verify_mode = ssl.CERT_NONE
conn = context.wrap_socket(sock, server_hostname=KLF200_ADDRESS)
try:
conn.connect((KLF200_ADDRESS, PORT))
process_connection(conn)
except BaseException as e:
raise(e)
finally:
conn.close()
main()