UDP Problem Server empfängt leitet aber nicht weiter...

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

count-doku

BeitragDi, Okt 29, 2013 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Muss es mal suchen, editiere es hier später rein.

Klar geht das auch übers Inet nur ist es da dann wirklich einfacher mit einem Port zu arbeiten.

lg,
count-doku

EDIT::::
Habe gesucht, es nicht gefunden. Allerdings konnte ich eben eine kleine Demo zusammenschustern,
sie besteht aus einem Masterserver und mehreren Clients. Das ganze läuft so ab:
Der Masterserver läuft, mit freigegeben Port und bekannter IP.

Wenn ein Client gestartet wird, verbindet er sich zum Masterserver und teilt diesem seine IP + Port mit.
Im Gegenzug erhält er die IPs / Ports aller anderen Clients.

Nun kannst du eine direkt Verbindung über sonst wieviele Ports ( musst halt aushandeln ) zwischen 2 Clients aufbauen. Oder alle Daten über den Masterserver schleusen.

Eines noch, wie oben geschrieben, der Masterserver benützt nur einen Port. Es ginge auch mit 2, wird dann aber komplizierter und zumindest für das connect müsste/könnte auch nur einer verwendet werden über den dann der 2. bekanntgegeben wird. Da ich dies allerdings als unnötig betrachte halt nur einen Port.

BlitzBasic: [AUSKLAPPEN]

; SERVER

Type TClient ; Hier kommen die ganzen Client infos rein.
Field ip%,dIP$,port%
Field name$
End Type


Const C_CONNECT=1 ; Client verbindet Byte
Const S_OK=100,S_OC=2 ; Server nimmt an, Server sendet Daten anderer Clients

Const SERVER_PORT=6543 ; Server Port
Global udpServer=CreateUDPStream(SERVER_PORT) ; UDP Stream erstellen
If Not udpServer Then RuntimeError "Serverport in use!"

Print "Masterserver running..."

While Not KeyHit(1)
RecvMsg()
Delay 16 ; Gibt ca 62 FPS, mit nem Timer besser gelöst
Wend
End

Function RecvMsg()
Local ipRecv=RecvUDPMsg(udpServer) ; Nachricht holen
If ipRecv = 0 Then Return ; Wenn keine kam, zurück

Local portRecv=UDPMsgPort(udpServer) ; Port auslesen
Local cmd=ReadByte(udpServer) ; Erstes Byte der Nachricht gibt an, was zu tun ist.
; Eigene Protokollabmachung, kannst es auch anders aufbauen
Select cmd ; Select was zu tun ist
Case C_CONNECT ; Client verbindet.

; Hier müsste noch ne Prüfung hin, ob Client schon existiert.
; Name ? IP ?

Local c.TClient=New TClient ; Neuen Client erstellen
c\ip=ipRecv ; Daten rein!
c\dIP=DottedIP(ipRecv)
c\port=portRecv

c\name=ReadLine(udpServer) ; Namen auslesen

Print "* "+c\name+" connected from "+c\dIP+":"+c\port

WriteByte udpServer,S_OK ; Bestätigen
SendUDPMsg udpServer,c\ip,c\port

For ct.TClient=Each TClient ; alle ANDEREN Clients
If ct<>c
WriteByte udpServer,S_OC ; Daten an neuen Client
WriteInt udpServer,ct\ip
WriteInt udpServer,ct\port
WriteLine udpServer,ct\name
SendUDPMsg udpServer,c\ip,c\port

WriteByte udpServer,S_OC ; Daten an andere Clients
WriteInt udpServer,c\ip
WriteInt udpServer,c\port
WriteLine udpServer,c\name
SendUDPMsg udpServer,ct\ip,ct\port

End If
Next



End Select
End Function


BlitzBasic: [AUSKLAPPEN]
;Client

SeedRnd MilliSecs() ; Zufall undso

Const C_CONNECT=1 ; Wieder mal konstanten, nur der übersichtlichkeit wegen xD
Const S_OK=100,S_OC=2

Const SERVER_PORT=6543 ; Server Port

Global SERVER_IP=INT_IP(Input("ServerIP: ")) ; IP Per input
Global udpStream=CreateUDPStream() ; UDP Stream erstellen, freien Port wird automatisch gewählt

Print "Connecting..."

WriteByte udpStream,C_CONNECT ; Connect anfrage schicken
WriteLine udpStream,Input("Name: ") ; Mit name
SendUDPMsg udpStream,SERVER_IP,SERVER_PORT ; Senden

While Not KeyHit(1)
RecvMsg
Delay 16
Wend
End

Function RecvMsg()
Local ipRecv=RecvUDPMsg(udpStream) ; UDP Msg abrufen
If ipRecv=0 Then Return

Local portRecv=UDPMsgPort(udpStream) ; Port holen

If ipRecv<>SERVER_IP Or portRecv<>SERVER_PORT Then Print "Hacked" ; Kamen die Daten nicht vom Server
; Hier könntest auch abfragen ob die Daten
; von nem anderen Client kommen

Local cmd=ReadByte(udpStream) ; Command byte holen
Select cmd
Case S_OK ; Server hat login akzeptiert
Print "Logged in"
Case S_OC ; Auflistung anderer Clients
Local oC_IP=ReadInt(udpStream)
Local oC_Port=ReadInt(udpStream)
Local oC_Name$=ReadLine(udpStream)

; Die Werte kannst dann für Direktverbindung oder sonstwas nutzen
Print "Other client "+oC_Name+" @ "+DottedIP(oC_IP) +":"+oC_Port
End Select


End Function

Function INT_IP(IP$) ; DottedIP to IntIP
a1 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
a2 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
a3 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
a4 = Int(IP$)
Return (a1 Shl 24) + (a2 Shl 16) + (a3 Shl 8 ) + a4
End Function
 

Bobo2040

BeitragMi, Okt 30, 2013 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok cool
Habs jetzt noch nicht getestet aber wozu ist beim Client die erste Zeile aldo mit
Dem seedrnd ?
Und noch ne frage wie kann ich es machen das eine Meldung an den User geht wenn
einer die Verbindung trennt ?

count-doku

BeitragMi, Okt 30, 2013 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Uff ja die Zeile ist überflüssig. Hatte früher mal die Namen per Rand vergeben, dafür war auch das SeedRnd.

Zur Frage wann ein User offline geht / seine Verbindung getrennt wird:
- Wenn jemand sein Programm normal beendet kannst einfach noch was an den Server senden
- Ansonsten lautet das Stichwort Ping. D.h. der Server sendet regelmäßig Pakete an die Clients und schaut ob diese zurückkommen, wenn nicht -> Client ist offline.
 

Bobo2040

BeitragMi, Okt 30, 2013 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok cool danke fuer die Hilfe von Allen.
Werde denke mal soweit alleine zurechtkommen.
Wenn ich noch ein Problem habe melde ich mich.
Mfg

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group