Отправка данных из клиентских приложений UWP на сбой сервера с ошибкой System.Runtime.InteropServices.COMException (0x8007274D)
Я хочу создать сервер, чтобы приложение UWP HoloLens могло подключаться к нему и отправлять на него данные.
Итак, чтобы создать сервер, я создал консольное приложение в Visual Studio и последовал примеру здесь
И на стороне клиента, приложения UWP, я создал следующий класс:
using UnityEngine;
#if !UNITY_EDITOR && UNITY_METRO
using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using Windows.Networking.Sockets;
using Windows.Storage.Streams;
using Windows.Networking;
using Windows.Foundation;
#endif
public class SendSocketStreamClient {
// The port number for the remote device.
private int port;
private string serverIP;
public SendSocketStreamClient(int portNum, string ip){
port = portNum;
serverIP = ip;
}
#if !UNITY_EDITOR && UNITY_METRO
private StreamSocket networkConnection;
// The response from the remote device.
private static String response = String.Empty;
public void StartClient()
{
// Setup a connection to the server.
HostName networkHost = new HostName(serverIP);
networkConnection = new StreamSocket();
IAsyncAction outstandingAction = networkConnection.ConnectAsync(networkHost, port.ToString());
AsyncActionCompletedHandler aach = new AsyncActionCompletedHandler(NetworkConnectedHandler);
outstandingAction.Completed = aach;
}
public void NetworkConnectedHandler(IAsyncAction asyncInfo, AsyncStatus status)
{
// Status completed is successful.
if (status == AsyncStatus.Completed)
{
DataWriter networkDataWriter;
// Since we are connected, we can send the data we set aside when establishing the connection.
using (networkDataWriter = new DataWriter(networkConnection.OutputStream))
{
networkDataWriter.WriteBytes(Encoding.ASCII.GetBytes("Sending Trial 1"));
// Again, this is an async operation, so we'll set a callback.
DataWriterStoreOperation dswo = networkDataWriter.StoreAsync();
dswo.Completed = new AsyncOperationCompletedHandler<uint>(DataSentHandler);
}
}
else
{
// TODO resend
Debug.Log("Failed to establish connection. Error Code: " + asyncInfo.ErrorCode);
networkConnection.Dispose();
}
}
public void DataSentHandler(IAsyncOperation<uint> operation, AsyncStatus status)
{
if (status == AsyncStatus.Error)
{
// didn't send, so requeue
Debug.Log("Error while sending " + operation.ErrorCode);
}
// Always disconnect here since we will reconnect when sending the next data.
networkConnection.Dispose();
}
#endif
}
Затем я вызываю этот класс в скрипте C#:
#if !UNITY_EDITOR && UNITY_METRO
SendSocketStreamClient newClient = new SendSocketStreamClient(ConnectionPort, ServerIP.Trim());
newClient.StartClient();
#endif
Но я всегда получаю ошибку ниже.
Не удалось установить соединение. Код ошибки: System.Runtime.InteropServices.COMException (0x8007274D): Невозможно установить соединение, поскольку целевой компьютер активно отказал ему.
Любая идея, что я делаю неправильно или как отправить данные с HoloLens на сервер? Что-то не так с сервером?
-----Редактировать----
Не удалось установить соединение. Код ошибки: System.Runtime.InteropServices.COMException (0x8007274C): Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, так как подключенный хост не смог ответить.
Ошибка изменилась на вышеуказанную, когда я установил serverIP в качестве IP-адреса моей машины вместо 127.0.0.1. Поэтому я думаю, что предоставление правильного IP-адреса решило эту ошибку, но теперь оно не подключается к серверу.
Означает ли это, что я создал сервер неправильно?
1 ответ
Как сказано в комментариях выше и как здесь я обнаружил, что на сервере я использую
IPAddress ipAddress = IPAddress.Loopback;
вместо
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
Изменение, которое решило мою проблему, и я смог подключиться к серверу из HoloLens и получать данные.