Laden...

TCP/Sockets für LAN-Multiplayergame: Verbindung langsam und Virenschutz meldet "Netzwerkangriff"

Erstellt von domin vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.936 Views
D
domin Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren
TCP/Sockets für LAN-Multiplayergame: Verbindung langsam und Virenschutz meldet "Netzwerkangriff"

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.

M
184 Beiträge seit 2012
vor 11 Jahren

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?

Z
403 Beiträge seit 2007
vor 11 Jahren

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é

4.221 Beiträge seit 2005
vor 11 Jahren

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...

D
domin Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

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

D
domin Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

ah ok Problem gelöst... ich hatte wirklich gedacht,dass ich die verbindunge nach jedem Senden-empfangen neu aufbauen muss 😁

also nochmals vielen Dank

4.221 Beiträge seit 2005
vor 11 Jahren

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...

D
domin Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

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^^

D
216 Beiträge seit 2009
vor 11 Jahren

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

4.221 Beiträge seit 2005
vor 11 Jahren

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Z
403 Beiträge seit 2007
vor 11 Jahren

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é