Как я могу получить ответ от моего сервера, использующего сокет udp между моим сервером и домом?C#

Место общения программистов C#
Ответить
Anonymous
 Как я могу получить ответ от моего сервера, использующего сокет udp между моим сервером и домом?

Сообщение Anonymous »

У меня есть сокет C# udp, из которого я пытаюсь отправить данные домой. Серверный сокет размещен на aws, а клиент — у меня дома. Используя пример UDPSocket.cs на GitHub, я изменил код, чтобы отправить ответ обратно клиенту после того, как сервер получит первое сообщение, отправленное клиентом.

Вот код клиента:

Код: Выделить всё

public void Client(string address, int port)
{
_socket.Connect(IPAddress.Parse(address), port);
Receive();
}

public void Send(string text)
{
byte[] data = Encoding.ASCII.GetBytes(text);
_socket.BeginSend(data, 0, data.Length, SocketFlags.None, (ar) =>
{
State so = (State)ar.AsyncState;
int bytes = _socket.EndSend(ar);
Console.WriteLine("SEND: {0}, {1}", bytes, text);
}, state);
}

public void Receive()
{
_socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
{
State so = (State)ar.AsyncState;
int bytes = _socket.EndReceiveFrom(ar, ref epFrom);
_socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
Console.WriteLine("RECV: {0}: {1}, {2}", epFrom.ToString(), bytes, Encoding.ASCII.GetString(so.buffer, 0, bytes));
}, state);
}

int port = 27000;

UDPSocket c = new UDPSocket();

int new_port = 40156;
IPEndPoint bep = new IPEndPoint(IPAddress.Parse([MY_HOME_INTERNAL_IP]), new_port );
if( bep != null ){
Console.WriteLine( "binding_to_ep" );
c._socket.Bind( bep );
c.Receive();
}

c.Client([REMOTE_SERVER_EXTERNAL_IP], port );
c.Send("TEST!");
Console.ReadKey();
вот код сервера:

Код: Выделить всё

public void Server(string address, int port)
{
_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.ReuseAddress, true);
_socket.Bind(new IPEndPoint(IPAddress.Parse(address), port));
Receive();
}

private void Receive()
{
_socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
{
State so = (State)ar.AsyncState;
int bytes = _socket.EndReceiveFrom(ar, ref epFrom);
_socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
Console.WriteLine("RECV: {0}: {1}, {2}", epFrom.ToString(), bytes, Encoding.ASCII.GetString(so.buffer, 0, bytes));

//this is where I attempt to send back to the client, but nothing get's received by the client it seems.
byte[] data = Encoding.ASCII.GetBytes("12");
//EndPoint epFrom1 = new IPEndPoint(IPAddress.Parse( [MY_HOME_EXTERNAL_IP] ), 40156);
EndPoint epFrom1 = new IPEndPoint(IPAddress.Parse([MY_HOME_EXTERNAL_IP]), 27000 );
_socket.SendTo(data, epFrom1 );
}, state);
}

UDPSocket s = new UDPSocket();
s.Server( [THE_SERVER_LOCAL_IP] , port );
до сих пор я передал сообщение на сервер, но в коде приема сервера, где я пытаюсь вызвать SendTo для отправки обратно клиенту, в методе приема клиента ничего не появляется . Раньше я получал сообщение об ошибке «Соединение отклонено» при попытке отправить клиенту, но теперь я не получаю никакого сообщения, что заставляет меня думать, что, возможно, данные прошли, но сейчас это не так. у кого-нибудь есть предложения. это было бы очень признательно. Я решил, что это будет довольно просто, и мне не придется возиться с правилами брандмауэра и прочим, потому что соединение уже/четко установлено, поэтому мой сервер должен легко отправлять данные обратно клиенту.
Кроме того, если кому-то интересно, сервер aws разрешает весь выходной трафик и запрещает входящий трафик на порт 27000, что необходимо, как указано в коде.
также типичное сообщение Я получаю от клиента, когда сервер получает первое сообщение: RECV: [MY_HOME_EXTERNAL_IP_ADDRESS]:[NUMBER_OF_BYTES]: 5, ТЕСТ!
Я пробовал запустить приведенный выше код и только отправлять сообщение на сервер сработало. сервер, похоже, не смог успешно отправить сообщение обратно клиенту, и нет сообщения об ошибке, подтверждающего, что случилось с отправленным обратно сообщением.
Я ожидал сообщение обратно клиенту в его методе «Received».
ОБНОВЛЕНИЕ: я попробовал запустить этот код локально на двух домашних машинах. он работал полностью, как и ожидалось, когда клиент отправляет сообщение на сервер, а сервер отправляет сообщение обратно. единственное, что я изменил, это то, где я установил epFrom1 для отправки сообщения обратно с сервера клиенту: EndPoint epFrom1 = new IPEndPoint(IPAddress.Parse("10.0.1.125"), port ); и, конечно же, я изменил все необходимые IP-адреса, чтобы их можно было использовать для этого локального эксперимента. в остальном все осталось по-прежнему; и это сработало так, как и ожидалось.

Подробнее здесь: https://stackoverflow.com/questions/793 ... een-my-ser
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»