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 :)



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: