Laden...

UDP-Verbindung

Erstellt von leuchtfeuer vor 11 Jahren Letzter Beitrag vor 11 Jahren 4.510 Views
L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren
UDP-Verbindung

Hi, habe einen UDP-Server und Client geschrieben. Mein Problem ist jetzt, dass ich auf die Nachricht des Server antworten will und so erstelle ich im Client einen neuen UDP-Client und antworte, jedoch blockiert das die Firewall.

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Wie bekomme ich die Ip des Absenders heraus?

verwende derzeit

Task<UdpReceiveResult> result = this.client.ReceiveAsync();
result.Result.RemoteEndPoint.Address

Da bekomme ich zwar eine Ip aber wenn ich darauf antworte kommt die Nachricht nicht an. Könnte das daran liegen, dass der Empfänger im selben Netzwerk liegt.

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

OK, innerhalb des selben Netzwerkes geht es jetzt aber außerhalb nicht.

16.806 Beiträge seit 2008
vor 11 Jahren

Beachte die Firewall.

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Ja und wie komme ich um die Firewall herum?

16.806 Beiträge seit 2008
vor 11 Jahren

So einfach schon mal gar nicht - das ist der Sinn einer Firewall.
Alles was eine Firewall nicht kennt wird abgeblockt - und das ist gut so.

Ausnahmen können durch den Administrator erstellt werden.
Wie findet man im Menü der jeweils eingesetzten Firewall.

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Bekomme beim Client kommt eine Firewallmeldung ob der die Verbindung zulassen will. Aber die Antwort kommt trotzdem nicht an auch wenn man auf ja drückt. Ist es dann überhaupt die Firewall?

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Also der Code meines Clients lautet:

	class Client
	{
		IPEndPoint sendTo;
		Socket socket;
		UdpClient client;
		//UdpClient listener;

		public Client()
		{


			client = new UdpClient();
			client.Connect("10.0.0.10", 5926);


			
			sendTo = new IPEndPoint(Dns.GetHostAddresses("10.0.0.10", 5926);
		}

		public void Send()
		{

			Byte[] sendBytes = Encoding.UTF8.GetBytes("hallo");

			int test = client.Send(sendBytes, sendBytes.Length);

			Console.WriteLine("receive");
			byte[] reveivedData = new byte[10];

			System.Threading.Thread.Sleep(5000);
			client.Client.Receive(reveivedData); //Hier kommt er nie drüber

			Console.WriteLine("message received");

			string message = UTF8Encoding.UTF8.GetString(
				reveivedData
			);

			sendBytes = Encoding.UTF8.GetBytes("test success");
			client.Send(sendBytes, sendBytes.Length);

			Console.WriteLine("Message received");
			Console.WriteLine("test success");
			Console.WriteLine("Press any key to exit");
			Console.ReadKey();
		}
	}
U
1.688 Beiträge seit 2007
vor 11 Jahren

Hallo,

lass das ".Connect" weg - UDP ist verbindungslos. Connect (s. MSDN) tut meist nicht das gewünschte.

Ansonsten kann man nur raten, zumal man ja jede Information erfragen muss. Z.B. kommunizierst Du im LAN oder über Internet, wie sind die IP-Adressen usw.

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Habe das jetzt probiert und es macht keinen Unterschied ob ich es mit Connect mache oder mit dem Konstruktor und Kommuniziere nun im Lan. Habe es voher mit eine Listener mit einem Port ohne IpAdresse versucht. Das funktioniert zwar innerhalb des Lans aber außerhalb wird der Listener der Client von den Firewalls blockiert.

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Habe jetzt noch etwas ausprobiert und bemerkt das das anpingen der Adresse die ich zurückbekomme auch nicht funktioniert ist es dann die Firewall und wenn ja wie behebe ich das?

Edit: Habe die Firewall am anderen Computer deaktiviert kann ihn trozdem nicht anpingen. Er ist im selben Netzwerk.

Code:

	public class UDPListener
	{

		private Socket Sock;

		private byte[] buff = new byte[1024];

		public UDPListener(int port)
		{

			IPAddress ipAddress = Dns.GetHostAddresses("*DnsHost*")[0];

			Sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
			ProtocolType.Udp);

			//IPAddress.Any
			IPEndPoint ippe = new IPEndPoint(IPAddress.Any, port);

			Sock.Bind(ippe);

			//Sock.Send(new byte[0]);

			Sock.BeginReceive(buff, 0, 1024, SocketFlags.None, new
			AsyncCallback(this.OnReceive), Sock);

			//Sock.Send(new byte[0]);
			//"10.0.0.10"
			UdpClient senderClient = new UdpClient(ipAddress.ToString(), port);
			senderClient.Client.Send(new byte[0]);

		}

		private void OnReceive(IAsyncResult ar)
		{

			Socket s1 = (Socket)ar.AsyncState;

			s1.EndReceive(ar);


			buff = new byte[1024];

			Console.WriteLine("Message received");
			s1.BeginReceive(buff, 0, 1024, SocketFlags.None, new
			AsyncCallback(this.OnReceive), s1);

		}

	}
16.806 Beiträge seit 2008
vor 11 Jahren

Versuch erst mal den Ping zum laufen zu bekommen.
Offensichtlich ist überhaupt keine Kommunikation möglich; ein Ping funktioniert immer, sofern man dieses nicht manuell deaktiviert - auch mit einer Firewall.

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Könnte das daran liegen das wir alle am selben Modem hängen. Innerhalb eines Modems geht man ja mit der selben IpAdresse ins Internet.

Also ich hole mir die IpAdresse mit

result = client.ReceiveAsync();
while ((result == null || !result.IsCompleted) && !stop)
{
	Thread.Sleep(10);
}
if (stop)
{
	break;
}
endPoint = result.Result.RemoteEndPoint;
L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Weiß keiner woran das liegen könnte?

Intern funktioniert alles nur außerhalb nicht. Kann die Adresse die ich zurückbekomme aber auch nicht anpingen.

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Habe jetzt beim anderen Rechner mit Wireshark mitgesnifft und das Paket kommt nie an. Der Rechner steht hinter eine Router und die Firewall war deaktiviert. Die Adresse die ich zurückbekomme kann ich auch nicht anpingen. Lokal funtkioniert alles.

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Habe jetzt mal jemanden gefragt der sich da gut auskennt und der hat mir geantwortet, dass es mit UDP ohne Holepunching oder so etwas nicht möglich ist. Und das mit dem Ping stimmt nicht. Man kann Computer auserhalb des eigenen Netwerkes nicht anpingen wenn der es nicht exta Freigegeben hat.

16.806 Beiträge seit 2008
vor 11 Jahren

Eigentlich wollte ich nicht mehr antworten, aber das muss korrigiert werden.

...ping doch einfach mal im Web ein Server Deiner Wahl an - er wird zu 99% der Fälle antworten.
Ping hat ne Standard-Regel in der Windows Firewall - auch noch in Server 2012. Soeben nachgeschaut. Der Eintrag heißt allow incoming icmp request.

Und wie Google soeben heraus gefunden hat wurde ich auch hier bestätigt: auch in Linux ist es standardmäßig aktiv. Muss manuell durch icmp_echo_ignore_all deaktiviert werden:

Turn on (1) or off (0), if the kernel should ignore all ICMP ECHO requests. Off by default.

Soviel zum Thema "auskennen" 😉

Viel Erfolg dennoch.

U
1.688 Beiträge seit 2007
vor 11 Jahren

Eigentlich wollte ich nicht mehr antworten

Warum nur? 😁

Ohne jetzt auf jede Unklarheit oder Mehrdeutigkeit einzugehen - hast Du im Router Portforwarding eingerichtet?

185 Beiträge seit 2005
vor 11 Jahren

Du solltest dich ein bisschen mit der Netzwerktechnik auseinandersetzen.
Stichwort: NAT und Portforwarding

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Ja habe ich und ich pinge ja auch nicht Server an sondern Computer hinter eine Router.

185 Beiträge seit 2005
vor 11 Jahren

Den wirst du nicht pingen können, auser du hast für den PING das Portforwarding zu dem Rechner eingerichtet.
Selbst dann wirst du keinen PING an den Rechner direkt abgesetzt bekommen, sondern nur einen PING an die IP-Adresse des Routers. Der leitet die Anfrage dann an den Rechner weiter.

Deshalb mein Hinweis auf NAT.