Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

04.08.2014, 16:43

Client/Server Programm (sockets) debuggen mit nur einem Rechner

Hi,
ich befasse mich nebenbei mal wieder mit der socket Programmierung und habe schon wieder das Problem, ein Client/Server Programm zu testen.
Früher hatte ich das immer über meinen Desktop und Laptop getestet, aber das war ziemlich umständlich.
Jetzt will ich das Programm einfach zwei mal auf einem Rechner ausführen.
Dafür habe ich bereits mit setsockopt und "SO_REUSEADDR" das Socket so konfiguriert, dass zwei Programme ein Socket an die selbe Adresse (inkl. Port) binden können.
Damit will ich beide an 127.0.0.1 binden.

Bis jetzt klappt es aber noch nicht. Der Client sendet eine Broadcast Nachricht und der Server sollte es eigentlich empfangen können und dann dem Client antworten.
Gibt's da noch was zu beachten, wenn man das auf einem Rechner testen will?
Ansonsten teste ich es doch erst mal wieder über zwei Rechner, wenn es dann immer noch nicht geht, muss der Fehler wo anders liegen.
Vielleicht hat ja jemand von euch Erfahrung mit sowas?!

Danke und Gruß,
Lukas

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

04.08.2014, 17:29

Ich hab meinen Bomberman-Klon auch ganz normal über einen PC getestet. Intern wurden UDP Sockets verwendet. Letztendlich sollte es transparent sein, welches Programm mit welchem auf welchem PC kommuniziert, man verbindet sich nur einfach "mit sich selbst". Jedoch habe ich eine Bibliothek verwendet, keine Ahnung was die im Hintergrund noch so macht. Da sich ein Client immer mit einem Server verbindet, sehe ich auch kein Problem, letztendlich sucht der Client einen Server mit Adresse 127.0.01 und Port XXXX. Und da sollte er was finden.

EDIT: Debuggen an sich kannst du aber in der Regel vergessen. Durch die ganzen Timeouts hast du wenig zeit bzw. oftmals sind das ja Timing-geschichten. Dann lieber in Logfiles schreiben und analysieren.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

04.08.2014, 17:41

Es geht mir erst mal noch gar nicht um die Zeit bzw. die Performance.
Momentan klappt einfach noch gar nix ^^
Die Nachrichten kommen nicht an. Aber ich denke auch, dass das Verbinden mit sich selbst zum Testen funktionieren sollte.
Ich weißt nur nicht, ob es reicht mit "setsockopt" die Wiederverwendung von Adressen für Sockets zu konfigurieren.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

04.08.2014, 18:07

Ich würde eher dazu raten Server und Client auf unterschiedliche Ports zu binden. Dann verhalten sich die Programme unabhängiger voneinander.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

04.08.2014, 18:30

Wie sollen Client und Server dann noch miteinander kommunizieren können?
Bei UDP und TCP Sockets müssen die Ports übereinstimmen. Da ich einen Broadcast durchführe, verwende ich UDP Sockets.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

6

04.08.2014, 18:42

Nee, die Ports dürfen nicht übereinstimmen. Wenn der Server startet, bindet er sich an einen Port. Dieser Port ist dann blockiert und kann auf dem selben Rechner nicht nochmal gebunden werden.

Üblicher Ablauf: Server starten, manuell an Port binden. Client starten und ohne Port-Bindung verbinden mit Ziel-IP und dem eingangs festgelegtem Port. Klappt hier stressfrei.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

7

04.08.2014, 21:19

Jetzt geht's. Danke :-)

Das "bind" mache ich jetzt nur noch für den Server. Aber ein anderes Problem war, dass ich "recvfrom" eine mit 0 initialisierte Adress Länge übergeben habe.
Das muss aber auf "sizeof(sockaddr_in)" oder "sizeof(sockaddr_in6)" initialisiert sein.
Hatte das übersehen, weil ich dachte das wird nur als output-Parameter genutzt.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

05.08.2014, 17:39

Nutzt du denn TCP oder UDP oder was anders? Weil recvfrom klingt nacht UDP, während deines Aussage des "nur auf dem Server Port binding" klingt nach TCP.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

9

05.08.2014, 23:35

Sicher? Ich nutze RakNet nur mit UDP und binde auch nur auf dem Server an einen Port.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

10

06.08.2014, 09:17

@Nox: Ich glaube du verwechselst "bind" mit "connect".

Werbeanzeige