UDP verbindung mit BNetEx

Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: UDP verbindung mit BNetEx

BeitragSo, Jan 13, 2013 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
jo wie soll ich anfangen,
habe ein problem oder auch nicht...^^ irgendwas stimmt nicht, nur was. also ich habe ein server und nen clienten geschrieben, der client macht nichts anderes ausser 1 mal die sekunde ein hallo an dem server zu senden. funktioniert auch (Global oder nenn wir es eine internetverbindung), schliesst man nun den clienten. läuft mein server weiter, und wartet eigentlich nur auf ankommende daten, starte ich nun den gleichen client wieder, kann keine verbindung mit dem server hergestellt werden. warum nicht?

also wir halten fest, server läuft
client hat die ip vom server und auch den port der freigegeben ist auf dem router.
starten das programm. alles funktioniert wunderbar
client sendet 1 mal die sekunde ein hallo
server bekommt das hallo und printet es.
wir beenden den client.
starten nach kb 30 sek den clienten erneut.
und der client kann keine verbindung mit den server mehr herstellen.

nun was ich getan habe:
habe den port beim server geändert, somit connectet der client nun auf dem neuen port. und diesen wieder im router freigegeben. starte den clienten, und ja es kommt wieder was an, nachm schliessen des clienten und ein neustart des clienten funktioniert es wieder nicht.

wo ist das problem, ich nutze windows 7 . ich habe eine direckte ip, vom server (Internet ip) eingegeben, diese hat sich in der zeit auch nicht geändert. habe es überprüft.

meine frage lautet nun... muss der server irgendwie sich vom client lösen? bevor der client wieder auf dem server connecten kann?

Hummelpups

BeitragSo, Jan 13, 2013 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, UDP ist ein Verbindungs/Sitzungsloses Protokoll
und die Pakete werden einfach blind an die Zieladresse
gesendet.

Funktioniert dein Code denn im LAN ohne die Internetschnittstelle?
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Mathias-Kwiatkowski

BeitragSo, Jan 13, 2013 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
also er funktioniert sowohl lan als auch internet gleich, naja wie kanns auch anders sein.

netzwerk is netzwerk^^
egal ob global, oder local.

ich find es nur interessant. sehr sogar... und wüsste gern woran es scheitert. vorallem, hat es in der vergangenheit mit dem modul so toll hingehaun.

bzw. macht es immernoch, nur halt, nach jedem neustart des clienten port switch ^^ also komplett umändern, und das is bei mir so. und auch bei 2 weiteren kollegen den ich einfach die exe geschickt habe.

die kommen auf mein server rauf "server ... mein lokaler rechner" und ja funtzt, sobald sie das prog schliessen und neustarten ... nichts...

BtbN

BeitragMo, Jan 14, 2013 1:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Vermutlich schlägt einfach das binden an den Port fehlt, weil du ihn im alten Client nicht wieder geschlossen hast und er somit noch belegt ist.

Mathias-Kwiatkowski

BeitragMo, Jan 14, 2013 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
ok wie kann ich den dan schliessen?
( vom alten client )

und muss das auf serverseite geschehen oder clinet seite?



falls keine verbindung aufgebaut werden kann, hab ich das hier
Code: [AUSKLAPPEN]
If (MilliSecs() - ServerReconnectTimer) > 999 * 5 Then
            If Stream Then Stream.Close()
            Stream.SetRemoteIP(TNetwork.IntIP(DottedIP(HostIp(ServerIP))))
            Stream.SetRemotePort(4112)
            WriteInt Stream, 0 'Bedeutet naricht kommt an
            WriteLine Stream, "Hallo WELT!"
            AusgangBytes = AusgangBytes + Stream.SendMsg()
            ServerReconnectTimer = MilliSecs()
         EndIf


das ganze habe ich eingebaut aber irgendwie.... wie gesagt jeder client kann maximal einmal connecten. ps. es können auch 3 clients drauf (auf dem server)

es kommt von allen 3 auch was an. aber sobald ein client schliesst laufen 2 weitere weiter ... kommt der client der geschlossen hat wieder "online" kommt er nicht durch ...
  • Zuletzt bearbeitet von Mathias-Kwiatkowski am Mo, Jan 14, 2013 1:37, insgesamt einmal bearbeitet

BtbN

BeitragMo, Jan 14, 2013 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Einfach den socket zu machen vorm beenden halt.

Mathias-Kwiatkowski

BeitragMo, Jan 14, 2013 1:37
Antworten mit Zitat
Benutzer-Profile anzeigen
meinst du so wie im edit?

es muss auf jedenfall etwas am clienten sein. den jede ip kann nur einmalig connecten, wenn die leute ihren roouter aus und wieder an machen funktioniert es auch wieder,
 

Hangman

BeitragMo, Jan 14, 2013 8:04
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
If (MilliSecs() - ServerReconnectTimer) > 999 * 5 Then 
If Stream Then Stream.Close()
Stream.SetRemoteIP(TNetwork.IntIP(DottedIP(HostIp(ServerIP))))
Stream.SetRemotePort(4112)
WriteInt Stream, 0 'Bedeutet naricht kommt an
WriteLine Stream, "Hallo WELT!"
AusgangBytes = AusgangBytes + Stream.SendMsg()
ServerReconnectTimer = MilliSecs()
EndIf


Das hat zwar nicht unmittelbar etwas mit deinem Problem zu tun, aber...
Erst schließt du den Stream und danach willst du etwas an den Stream senden.
Das kann nicht funktionieren.
Ich habe Berthold gebrochen.

Mathias-Kwiatkowski

BeitragMo, Jan 14, 2013 10:00
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, wie kann ich dann den socket zu machen?

ich mein stream.close() <- ist es ja scheinbar nicht.
 

Hangman

BeitragMo, Jan 14, 2013 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
stream.close() ist schon richtig.
Deine "Reconnect"-Funktion funktioniert nicht, weil ein Stream.Init() noch fehlt, aber das erklärt noch nicht warum die Verbindung nicht funktioniert, wenn du den Client neustartest.
Falls du bereit wärst den kompletten Source von Server und Client hochzuladen, würde ich mal schauen wo das Problem liegt.

Und
BtbN hat Folgendes geschrieben:
Vermutlich schlägt einfach das binden an den Port fehlt, weil du ihn im alten Client nicht wieder geschlossen hast und er somit noch belegt ist.

Normalerweise wird der Port wieder freigegeben, wenn das Programm geschlossen wird.
Aber das lässt sich ganz leicht überprüfen, da die Portsetzfunktionen True oder False zurückliefern.
Nach Mathias's Code zu urteilen arbeitet der Client mit einem dynamischen Port (so wie es sein sollte), von daher würde es auch funktionieren, falls der alte Port aus mysteriösen Gründen noch belegt sein sollte.
Ich habe Berthold gebrochen.

Hummelpups

BeitragMo, Jan 14, 2013 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
If (MilliSecs() - ServerReconnectTimer) > 5000 Then 
ServerReconnectTimer=MilliSecs()

Stream.init()
Stream.SetRemoteIP(TNetwork.IntIP(DottedIP(HostIp(ServerIP))))
Stream.SetRemotePort(4112)
WriteInt Stream, 0 'Bedeutet nachricht kommt an
WriteLine Stream, "Hallo WELT!"
Print Stream.sendmsg()
Stream.close
End If


Na dann probier das doch mal
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus
 

Hangman

BeitragMo, Jan 14, 2013 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke das soll eine Reconnect-Funktion des Clients sein, von daher wäre der korrekte Code dafür eher:
BlitzMax: [AUSKLAPPEN]

If (MilliSecs() - ServerReconnectTimer) > 999 * 5 Then
If Stream Then Stream.Close()
Stream = New TUDPStream
Stream.Init()
Stream.SetRemoteIP(TNetwork.IntIP(DottedIP(HostIp(ServerIP))))
Stream.SetRemotePort(4112)
WriteInt Stream, 0 'Bedeutet naricht kommt an
WriteLine Stream, "Hallo WELT!"
AusgangBytes = AusgangBytes + Stream.SendMsg()
ServerReconnectTimer = MilliSecs()
EndIf
Ich habe Berthold gebrochen.

BtbN

BeitragMo, Jan 14, 2013 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, geschlossen wird er, aber meiner Erfahrung nach nicht sofort. Nach ein paar minuten sollte er aber wieder frei sein.

Mathias-Kwiatkowski

BeitragMo, Jan 14, 2013 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
also hier der client eigentlich kleiner code.

Code: [AUSKLAPPEN]
Global Socket:TSocket
Global StreamTCP:TStream
Global Stream:TUDPStream
Stream = New TUDPStream
If Not Stream.Init() Then Throw("Can't create socket")
Stream.SetRemoteIP(TNetwork.IntIP(DottedIP(HostIp(Server))))
Stream.SetLocalPort()
Stream.SetRemotePort(41121)


Global Timer:Int = MilliSecs()

Graphics 800, 600
Repeat
   If (MilliSecs() - Timer) > 999 Then
      WriteInt Stream, 0
      WriteLine Stream, "Hallo WELT!"
      Timer = MilliSecs()
   End If
Until KeyDown(KEY_ESCAPE)
End



so es funktioniert auch (wenn man die serverip eingibt ), das reconnect, brauch ich eigentlich nicht... war nur so ein versuch. naja mit dem kleinen code fing alles an. solang das prog aktiv ist, sendet er tatsächlich dinge zum server, auch vom kollegen aus, also server zugrif ist möglich, beendet man den client aber, und startet den nochmals, kommt man nicht mehr auf dem server drauf. mysteriös....
 

Hangman

BeitragMo, Jan 14, 2013 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nehme mal an, du hast beim Copy-Pasten das stream.sendMsg() vergessen Question Exclamation

Also ich sehe ansonsten keinen Fehler in deiner Clientversion und ich habe mir mal schnell einen passenden Testserver geschrieben:
BlitzMax: [AUSKLAPPEN]

SuperStrict
Import vertex.bnetex

Global udpStream:TUDPStream = New TUDPStream
If Not udpStream.Init() Then Throw("Can't create UDP socket")
udpStream.SetLocalPort(7707)

Repeat
If udpStream.RecvAvail() Then
While udpStream.RecvMsg()
If udpStream.Size() > 0 Then
While Not udpStream.Eof()
ReadInt(udpStream)
Print(ReadLine(udpStream))
Wend
End If
Wend
EndIf
Delay 2
Forever


Ich kann da so oft hintereinander connecten wie ich will... wie erwartet. Auch mit zich Clients gleichzeitig kein Problem.
Her mit dem Servercode bitte Wink
Ich habe Berthold gebrochen.
  • Zuletzt bearbeitet von Hangman am Mo, Jan 14, 2013 18:09, insgesamt einmal bearbeitet

Mathias-Kwiatkowski

BeitragMo, Jan 14, 2013 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Global Socket:TSocket
Global StreamTCP:TStream
Global Stream:TUDPStream
Stream = New TUDPStream
If Not Stream.Init() Then Throw("Can't create socket")
Stream.SetRemoteIP(TNetwork.IntIP(DottedIP(HostIp(Server))))
Stream.SetLocalPort()
Stream.SetRemotePort(41121)


Global Timer:Int = MilliSecs()

Graphics 800, 600
Repeat
   If (MilliSecs() - Timer) > 999 Then
      WriteInt Stream, 0
      WriteLine Stream, "Hallo WELT!"
Stream.SendMsg() ' <--------------------------------
      Timer = MilliSecs()
   End If
Until KeyDown(KEY_ESCAPE)
End



ähm ja in live ist es drin... aber wie gesagt das problem habe ich immernoch, jedenfalls mit globaler ip mit localer ip, geht es ohne probleme... was kann es sein, ich weiss nicht wie ich ein fehler suchen soll wenn ich nicht weiss wo ich beginnen soll.

und warum gehts einmal, aber kein 2 mal mehr ? das ist doch mehr als komisch....
 

Hangman

BeitragMo, Jan 14, 2013 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach mit lokaler IP geht auch das Mehrfachconnecten?
Das war mir jetzt nicht so klar, dann siehts ja eher nach Router-/Firewallproblematik aus, und da kenn ich mich dann nicht mehr so aus.
Ich habe bei mir die Ports geöffnet für meine Projekte und damit noch nie Probleme gehabt (mit globaler IP übers Netz).
Ich habe Berthold gebrochen.

Mathias-Kwiatkowski

BeitragMo, Jan 14, 2013 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bis jetzt auch nicht.

also wäre es ein router konflickt, würde keiner drauf kommen Wink
und es würde keiner mehr connecten können. nichtmal 1 mal!

und einmal geht ja. das 2. mal nicht mehr.

aber kanns sein das mein kollege mit dem ich es getestet habe, vieleicht ein windows problem hat? oder eine harte firewall? die den client als vertrauensunwürdig erkennt?

ja das es local geht habe ich auch erst vor paar stunden herrausgefunden.... ich selber, habe ein weiteres netzwerk, und komme auch immerwieder drauf (global)
 

Hangman

BeitragMo, Jan 14, 2013 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Teste es mit einer weiteren Person Surprised
Ich habe Berthold gebrochen.

Hummelpups

BeitragMo, Jan 14, 2013 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Mathias-Kwiatkowski hat Folgendes geschrieben:
also wäre es ein router konflickt, würde keiner drauf kommen Wink


zuvor:

Hummelpups hat Folgendes geschrieben:
Funktioniert dein Code denn im LAN ohne die Internetschnittstelle?


Mathias-Kwiatkowski hat Folgendes geschrieben:
also er funktioniert sowohl lan als auch internet gleich, naja wie kanns auch anders sein.

netzwerk is netzwerk^^
egal ob global, oder local.
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group