Вот код клиента:
Код: Выделить всё
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 );
Кроме того, если кому-то интересно, сервер 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
Мобильная версия