Ich habe für ein kleines LAN-Multiplayergame TCP und Sockets benutzt nur leider habe ich jetzt das Problem, dass die Verbindung einfach zu langsam ist.Da man nun den Gegner nicht in Echtzeit sehen kann ruckelt das spiel. Außerdem schlägt dann auch noch Kaspersky an. Es versucht die ganze zeit den "Netzwerkangriff" zu blockieren (anscheinend findet es DoS.Generic.SYNFlood).
Sollte ich da vielleicht UDP verwenden oder was schlagt ihr vor.
Ich würde den Fehler nicht unbedingt in der Verbindung suchen, sondern im Protokoll oder generell im Konzept.
Bzgl. UDP und TCP: UDP ist schneller als TCP, du musst dir aber Gedanken darüber machen, wie wichtig die Daten sind, die du versenden willst. Bei UDP gibt es keine Garantie, dass die Pakete auch tatsächlich ankommen.
Wenn du eine Sicherheit brauchst, dass die Pakete auch ankommen, brauchst du TCP.
Wie sieht denn dein Protokoll aus?
Hallo domin,
das ist schwierig zu beurteilen ohne die Architektur des Spieles zu kennen, generell reicht TCP dafür aus.
Um das "ruckeln" zu vermeiden wirst du um Interpolation nicht herum kommen.
UDP wird es dir nicht einfacher machen, es bietet vielleicht einen performance Vorteil, allerdings musst du dich um andere Dinge kümmern, wie Paket Reihenfolge und du musst prüfen ob Pakete überhaupt ankommen.
Als Referenz Diablo 2 u. 3 verwenden auch TCP 🙂
Die SYN Flood Meldung kann eigentlich bzw. sollte eigentlich nur dann kommen wenn zu oft ein Verbindungsversuch gestartet wird. (Oder natürlich wenn wirklich ein SYN Flooding durchgeführt wird)
Edit: Da war einer schneller 🙂
André
Tönt für mich eher so, als würdest Du die Verbindung immer auf und abbauen statt stehen zu lassen...
Dies würde sowohl das Antiviren-Problem als auch die lausige Performance erklären.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Erst mal danke für die ganzen Antworten. Um etwas mehr Klarheit zu schaffen sollte ich vielleicht anmerken, dass ich dabei bin ein kleines 2D Autorennen zu programmieren. Es müssen also hauptsätzlich nur Positionsdaten verschickt werden.
@Programmierhans: da hast du sehr wahrscheinlich recht; mein Programm ist übrigens wie in diesem Tutorial aufgebaut: TCP/IP Socket-Programmierung in C# - Daten senden und empfangen
Wie kann ich denn eine Verbindung wieder benützen?
Danke euch allen!
Domin
ah ok Problem gelöst... ich hatte wirklich gedacht,dass ich die verbindunge nach jedem Senden-empfangen neu aufbauen muss 😁
also nochmals vielen Dank
Bedank dich bei TheGear... er hat mich eigentlich auf die Idee gebracht 😃
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
oje ich glaub da hab ich mich wohl zu früh gefreut...
nochmal zum verständnis:
client:
zuerst erstell ich den socket:
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
...
dann verbind ich ihn mit dem server:
sock.Connect(ipEo);
...
dann sende ich zuerst:
sock.Send(buffer);
sock.Shutdown(SocketShutdown.Send);
...
und dann empfange ich:
while ((anzahl_an_bytes = sock.Receive(bytesRcvd_übergang, 0, bytesRcvd_übergang.Length,SocketFlags.None)) > 0)
{
text_empfangen += Encoding.UTF8.GetString(bytesRcvd_übergang).Replace("\0","");
bytesRcvd_übergang = new byte[10];
sock.Shutdown(SocketShutdown.Receive);
}
...
und dann weiß ich nicht genau was ich tun sol:
entweder:
sock.Disconnect(true);
oder:
sock.Close();
und wo muss ich dann wieder beginnen?? bei schritt 1 ,schritt 2...?
PS: Nochmal danke an TheGear^^
du brauchst weder Disconnect noch Close. Hier mal nen simples Beispiel:
using (TcpClient client = new TcpClient()) {
client.Connect("127.0.0.1", 1337);
using (NetworkStream stream = client.GetStream()) {
bool run = true;
while(run) {
try {
if(stream.DataAvailable) {
ReadDataFromStream(stream);
} else {
Thread.Sleep(10);
}
} catch(IOException x) {
run = false;
}
}
}
}
Darth Maim
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hallo domin,
sock.Shutdown(SocketShutdown.Receive);
Innerhalb deiner While Schleife rufst du Shutdown auf.
Das führt dazu das die Verbindung nicht weiter benutzt werden kann, weil alle Resourcen freigegeben werden.
Wie bereits gesagt, lass die Verbindung offen und schliess sie erst wenn du fertig bist oder das Programm beendest.
André