I wrote a small test to help me understand the way an internet game should look. But I can't get it to work. The client connects fine, but only the server can see the client and not vice versa. I think the server, once it recieves the new client message (type 100), doesn't send a message identifying the host (type 101)
Here's the code. Thanks for helping.
Graphics 800,600,32,2
SetBuffer BackBuffer()
Global host,udpport,destport,main,intip
Type pl
Field x,y
Field name$,port
End Type
Type netpl
Field x,y
Field name$,port,ip
End Type
host=Input ("host (1) or join (0)")
If host=1 Then
udpport=4000
destport=4001
Else
udpport=4001
destport=4000
EndIf
;create the stream
main=CreateUDPStream(udpport)
If main=0 Then RuntimeError "Could not create stream"
Print "Stream Created"
If host=0 Then
ip$=Input$ ("Host IP: ")
intip=DotToInt%(ip$) ;NEEDS TO BE AN INT IP!
WriteLine main,"100"+name$
SendUDPMsg main,intip,destport ;send "new player" message
EndIf
name$=Input ("UserName: ")
;make local player
p.pl=New pl
p\x=200
p\y=300
p\name$=name$
p\port=UDPStreamPort(main)
While Not KeyDown(1)
UpdatePlayers()
UpdateNetwork()
Cls
Draw()
Flip
Wend
CloseUDPStream(main)
End
Function UpdateNetwork()
HandleMessages() ;check messages
SendMessages() ;send messages
End Function
Function HandleMessages()
If senderip=RecvUDPMsg(main) Then
msg$=ReadLine$(main)
DebugLog msg$
Select Left(msg$,3)
Case 100
DebugLog "Player Found"
;get rid of extranous info
name$=Replace$(msg$,"100","")
;new player!
n.netpl=New netpl
n\x=600
n\y=300
n\name$=name$
n\port=UDPMsgPort(main)
n\ip=UDPMsgIP(main)
;send him the server info
WriteLine main,"101"+name$
DebugLog UDPMsgIP(main)
SendUDPMsg main,DotToInt(UDPMsgIP(main)),destport
;ADD OTHER PLAYER INFO SENT
Case 101
;client identifies host
DebugLog "Host Found"
;get rid of extranous info
name$=Replace$(msg$,"101","")
;make new player
n.netpl=New netpl
n\x=200
n\y=300
n\name$=name$
n\port=UDPMsgPort(main)
n\ip=UDPMsgIP(main)
Case 200
;movement massage
coor$=Replace$(msg$,"200","")
newx=Left(coor$,3)
newy=Right(coor$,3)
;find player
For n.netpl=Each netpl
If UDPMsgIP(main)=n\ip Then
n\x=newx
n\y=newy
EndIf
Next
End Select
EndIf
End Function
Function SendMessages()
For p.pl=Each pl
WriteLine main,"200"+LSet$(p\x,3)+LSet(p\y,3) ;write coordinates to stream
If host=0 Then SendUDPMsg main,intip,destport
If host=1 Then
;cycle through clients
For n.netpl=Each netpl
SendUDPMsg main,n\ip,destport
Next
EndIf
Next
End Function
Function UpdatePlayers()
For p.pl=Each pl
If KeyDown(200) Then p\y=p\y-2
If KeyDown(208) Then p\y=p\y+2
If KeyDown(205) Then p\x=p\x+2
If KeyDown(203) Then p\x=p\x-2
Next
End Function
;Function Chat()
;
;If Not KeyDown(203) Or Not KeyDown(205) Or Not KeyDown(200) Or Not KeyDown(208) Then
;key=GetKey()
;EndIf
;
;If key
;
;End Function
Function Draw()
For p.pl=Each pl
Text p\x,p\y,"{"+p\name$+"}",1,1
Next
For n.netpl=Each netpl
Text n\x,n\y,"["+n\name$+"]",1,1
Next
End Function
Function DotToInt%(ip$)
off1=Instr(ip$,".") :ip1=Left$(ip$,off1-1)
off2=Instr(ip$,".",off1+1):ip2=Mid$(ip$,off1+1,off2-off1-1)
off3=Instr(ip$,".",off2+1):ip3=Mid$(ip$,off2+1,off3-off2-1)
off4=Instr(ip$," ",off3+1):ip4=Mid$(ip$,off3+1,off4-off3-1)
Return ip1 Shl 24 + ip2 Shl 16 + ip3 Shl 8 + ip4
End Function
|