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.
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.
OK, innerhalb des selben Netzwerkes geht es jetzt aber außerhalb nicht.
Beachte die Firewall.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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?
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();
}
}
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.
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.
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);
}
}
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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;
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.
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.
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Eigentlich wollte ich nicht mehr antworten
Warum nur? 😁
Ohne jetzt auf jede Unklarheit oder Mehrdeutigkeit einzugehen - hast Du im Router Portforwarding eingerichtet?
Du solltest dich ein bisschen mit der Netzwerktechnik auseinandersetzen.
Stichwort: NAT und Portforwarding
Ja habe ich und ich pinge ja auch nicht Server an sondern Computer hinter eine Router.
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.