Hier ist der Client-Code:
Code: Select all
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();
Code: Select all
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 );
Falls sich das jemand wundert: Der AWS-Server lässt den gesamten Ausgabeverkehr zu und verbietet den eingehenden Verkehr an Port 27000, was laut Code erforderlich ist.
auch, eine typische Nachricht, die ich bekomme vom Client, wenn diese erste Nachricht vom Server empfangen wird, lautet: RECV: [MEIN_HOME_EXTERNAL_IP_ADDRESS]:[NUMBER_OF_BYTES]: 5, TEST!
Ich habe versucht, den obigen Code auszuführen und nur die Nachricht zu senden zum Server funktionierte. Der Server schien nicht in der Lage zu sein, eine Nachricht erfolgreich an den Client zurückzusenden, und es gibt keine Fehlermeldung, die bestätigt, was mit der zurückgesendeten Nachricht passiert ist.
Ich hatte eine erwartet Nachricht an den Client in seiner Methode „Received“ zurück.
UPDATE: Ich habe versucht, diesen Code lokal auf zwei Heimcomputern auszuführen. Es funktionierte wie erwartet, wenn der Client eine Nachricht an den Server sendet und der Server eine Nachricht zurücksendet. Das einzige, was ich geändert habe, war, wo ich epFrom1 so eingestellt habe, dass eine Nachricht vom Server an den Client zurückgesendet wird: EndPoint epFrom1 = new IPEndPoint(IPAddress.Parse("10.0.1.125"), port ); und natürlich habe ich alle notwendigen IPs geändert, damit sie für dieses lokale Experiment verwendet werden können. Ansonsten blieb alles beim Alten; und es hat genau wie erwartet funktioniert.