Hosts im LAN finden(über UDP) von ??? |
Hier mal ein Code wie man über UDP laufende Spiele im LAN finden kann(BB2D). Prinzip: Es wird über die sog. BroadCast-IPs an alle PCs in dem entsprechenden SubNetz eine Message geschickt. Erhält das Programm auf einem anderen PC nun diese Message, wird mit einer "Hallo ich bin da!"-Nachricht geantwortet. Alle PCs die auf die Message geantwortet haben sind folglich Hosts... Anleitung: Das Programm muss auf jedem PC der angezeigt werden soll, aufgerufen und eine kurze Host-Beschreibung eingegeben werden. Mit Enter kann man die vom Programm vergebene Nummer eines gefundenen Servers eingeben und diesem dann eine Nachricht schicken. Mit <R> kann die Serverliste aktualisiert werden. [code:1:9aae48e8d5] Graphics 600, 460, 16, 2 Type NetHost Field IP% Field Port% Field Ping% Field GameInfo$ End Type Global Stream Global Port% Global StartTime% Global HostCounter% Const N_MESSAGE% = 0 Const N_REQUEST% = 1 Const N_ANSWER% = 2 Const COL_INPUT% = 0 Const COL_LIST% = 1 Const COL_MESSAGE% = 2 Const C_BroadCastIPs% = 1 ;Anzahl der BroadCastIPs - 1 Dim BroadCastIP%(C_BroadCastIPs%) BroadCastIP%(0)=ipint("192.168.0.255") BroadCastIP%(1)=ipint("192.168.1.255") SetCol(COL_INPUT%) ;Port% = Input$("Port:") Port% = 44444 ServerInfo$ = Input$("Deine Serverinfo:") Stream=CreateUDPStream (port%) If Stream Then CountHostIPs ("") Print "Socket erstellt auf " + DottedIP(HostIP(1)) + "|" + UDPStreamPort (Stream) Else RuntimeError "Socket konnte nicht erstellt werden!" EndIf ;IP% = IPInt(Input$("IP: ")) ;Port% = Input$("JoinPort: ") HostRefresh() Repeat If RecvUDPMsg (Stream) Then Select ReadByte (Stream) Case N_MESSAGE% ;Normale Nachricht SetCol(COL_MESSAGE%) Print "Nachricht von " + ServerInfo$() + ": " + ReadString$(Stream) Case N_REQUEST% ;Spielanfrage SendMsg(UDPMsgIP (Stream),N_ANSWER%,ServerInfo$) Case N_ANSWER% Host.NetHost = New NetHost HostPing% = MilliSecs() - StartTime% HostIP% = UDPMsgIP (Stream) HostPort% = UDPMsgPort (Stream) HostGameInfo$ = ReadString$ (Stream) HostCounter% = HostCounter% + 1 SetCol(COL_LIST%) Print + HostCounter% + ": " + ServerInfo$() + " Ping: " + HostPing% + " Info: " + HostGameInfo$ End Select EndIf Key% = GetKey() Select Upper(Chr$(Key%)) Case Chr$(13) ;Return SetCol(COL_INPUT%) HostNumber% = Input$("Hostnummer:") SendMsg(Number2IP(HostNumber%),N_MESSAGE%,Input$("Deine Nachricht:")) Case Chr$(27) ;ESC CloseUDPStream(Stream) End Case "R" ;Refresh HostRefresh() Case "P" ;Change Port SetCol(COL_INPUT%) Port% = Input$("JoinPort: ") End Select Forever Function SendMsg(IP%, MsgID%, Message$) WriteByte Stream, MsgID% WriteString Stream, Message$ SendUDPMsg Stream, IP%, Port% End Function Function Number2IP(Number%) For Host.NetHost = Each NetHost i% = i% + 1 If i% = Number% Then Return HostIP% Next End Function Function HostRefresh() For Host.NetHost = Each NetHost Delete Host.NetHost Next HostCounter% = 0 SetCol(COL_LIST%) Print "Hostliste:" For i% = 0 To C_BroadCastIPs% SendMsg(BroadCastIP%(i%), N_REQUEST%, "") Next StartTime% = MilliSecs() End Function Function ServerInfo$() Return DottedIP(UDPMsgIP (Stream)) + "|" + UDPMsgPort (Stream) End Function Function SetCol(Col%) Select Col% Case COL_INPUT% Color 180, 180, 180 Case COL_LIST% Color 230, 230, 0 Case COL_MESSAGE% Color 255, 0, 0 End Select End Function ;Von DC geklaut(thx): Function ipint(inputIP$) ;-> wandelt ip$ in interger um Local break1,break2,break3,add1,add2,add3,add4,ipreturn ; break1 = Instr(inputIP$,".") ; break2 = Instr(inputIP$,".",break1+1) ; break3 = Instr(inputIP$,".",break2+1) ; add1 = Mid(inputIP$,1,break1-1) ; add2 = Mid(inputIP$,break1+1,break2-1) ; add3 = Mid(inputIP$,break2+1,break3-1) ; add4 = Mid(inputIP$,break3+1) ; ipreturn=(add1 Shl 24) + (add2 Shl 16) + (add3 Shl 8) + add4 ; Return ipreturn ; End Function [/code:1:9aae48e8d5] Das Ding ist allerdings noch nicht ganz ausgegoren und ich hoffe deswegen auf euer Feedback um es verbessern zu können. Interessant wäre z.B. welche IPs ihr in eurem Netzwerk verwendet. |
von ??? |
Mal ne Frage: Wiso speicherst du die meisten Variabeln als Binär? Braucht dies weniger Speicher? Zbsp IP braucht 4 x 1 Byte... Oder was ist der Grund? |
von ??? |
boa cool, muss ich testen... scheiss startnetgame fenster 8) wir nutzen "192.168.0.xxx" |
von ??? |
hmm, ich speichere doch gar nix binär... Edit: Wenn du die IPs meinst: Weil ich die ja an die entsprechenden Befehle so übergeben muss... |
von ??? |
Siehe hier: http://www.blitzbase.de/tabellen/sonderzeichen.htm [quote:37a06ca07a]Beachte auch, dass BlitzBasic bereits standardmäßig mit Integerwerten rechnet und somit dieses Zeichen weggelassen werden kann![/quote:37a06ca07a] |
von ??? |
ja, weggelassen werden kann... aber nicht weggelassen werden muss :D Hab das noch von QB... |
von ??? |
Achso... es irritiert halt ein wenig... aber ist ok... Ist interessantes Beispiel... kann ich gut gebrauchen für mein kleines NetGame :) |
von ??? |
wie findet eigentlich startnetgame die spiele raus? auch im inet findet startnetgame die spiele... hmm... ich komm damit nit zurecht :) ich wollte das zu functionen umschreiben... ich kriegs net hin. möchte das doch auch in meinem game nutzen :wink: @morszeck: Replace --> "%" zu "" replace all fertig :) |