Wie kann ich eine Antwort von meinem Server erhalten, auf dem ein UDP-Socket zwischen meinem Server und meinem Zuhause lC#

Ein Treffpunkt für C#-Programmierer
Guest
 Wie kann ich eine Antwort von meinem Server erhalten, auf dem ein UDP-Socket zwischen meinem Server und meinem Zuhause l

Post by Guest »

Ich habe einen C#-UDP-Socket, von dem ich Daten zu mir nach Hause senden möchte. Der Server-Socket wird bei aws gehostet und der Client ist bei mir zu Hause. Mithilfe des UDPSocket.cs-Beispiels auf GitHub habe ich den Code so geändert, dass er eine Antwort an den Client zurücksendet, nachdem der Server die erste vom Client gesendete Nachricht empfangen hat.

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();
hier ist der Servercode:

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 );
Bisher habe ich die Nachricht an den Server weitergeleitet, aber im Empfangscode des Servers, in dem ich versuche, SendTo aufzurufen, um es an den Client zurückzusenden, wird in der Client-Empfangsmethode nichts angezeigt . Früher habe ich beim Versuch, etwas an den Client zu senden, die Fehlermeldung „Verbindung abgelehnt“ erhalten, aber jetzt erhalte ich keine Nachricht, was mich vermuten lässt, dass die Daten vielleicht durchgekommen sind, was jetzt aber nicht der Fall ist. Hat jemand irgendwelche Vorschläge? Es wäre sehr dankbar. Ich dachte, das wäre ziemlich einfach und ich müsste mich nicht mit Firewall-Regeln und so herumschlagen, weil die Verbindung bereits/eindeutig hergestellt ist und mein Server daher problemlos in der Lage sein sollte, Daten an den Client zurückzusenden.
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post