Gnet Bug, Please i need a running Fix !!

BlitzMax Forums/BlitzMax Programming/Gnet Bug, Please i need a running Fix !!

Hi,

(sry bad english !)

Please i need HELP or a fix !! to get the right GnetMessageObject from a GnetMessage.

I wrote a litle Samplecode, i need GnetMessages and i got no time to write a new "lowlevel- NetLib" like Gnet for me, and Gnet allready exist and it works fine but this one problem is a Great Problem and it makes Gnet bad.


I try the Fix
http://blitzbasic.com/Community/posts.php?topic=80476

but it doesn't work

Try This code and start more Instances, every GnetObject send a Message (all 2000 Millisecs), in a normal case each Client must receive a
remote message and do print a ID string but nothing like this "Sender Is LocalClient" is happens.

'//////////////////////////////////////
'/
'/
'/
'/ GNET BUG !!
'/
'/ -----------------------------------

SuperStrict

Import brl.gnet

Global _self		:TgnetHost	= CreateGNetHost ()
Global _localclient :TgnetObject	
Global Port		:Int			=12345
Global Counter		:Int
	

If Not Join  () Host ()

GNetListen (_self,Port)

Graphics 100,40,,0
		

Repeat

	Cls
	
	If KeyHit(key_escape) Or AppTerminate () End
		
	ControlMessages ()
	ControlObjects  ()
		
	If MilliSecs()-Counter > 2000 Counter=MilliSecs() SendMSG()
	
	
	
	Flip

	Delay (50)

	GNetSync (_Self)
	
Forever

Function Join:Byte()

 

		If GNetConnect (_Self,"127.0.0.1",Port,1000)
		
		_localclient = CreateGNetObject (_Self)
		
		Print "Client" AppTitle="Client"

		Return True

		EndIf
	
								 	
End Function 


Function Host:Byte()

		_localclient = CreateGNetObject (_Self)

		If _localclient 

		Print "HOST" AppTitle="HOST"

		Return True

		EndIf
		
				
EndFunction 


Function ControlMessages()


Local Message:TGnetObject

If _Localclient

	For Message=EachIn GNetMessages(_Self)

		Print"______________"
		Print"INCOMING MSG :"

				
		Local MSGObj:TGNETOBJECT = GNetMessageObject (Message)

		If GNetObjectLocal (MSGObj) Print "SENDER IS LOCALCLIENT ?!!?!!"
				
		If MSGObj 

			Local TargetObject:String = String(GetGNetTarget (MSGOBJ))
			If TargetObject Print "from : "+TargetObject 
		
		EndIf 
		
	Next

EndIf


EndFunction


Function ControlObjects()

Local NetObject:TGnetObject

If _Localclient

	For NetObject=EachIn GNetObjects(_self)


		If GNetObjectLocal (NetObject) Continue 
		
		Local State:Int=NetObject.State()
		
			
		Select State
		
		Case Gnet_Closed  

		Print"________________"
		Print"Client CLOSED  :"

		Local TargetString:String = String(GetGNetTarget (NetObject))
			If TargetString Print "ID : > "+TargetString+" <" 

		Continue




		Case Gnet_Created 	
		
		Print"________________"
		Print"Client Created :"
		
		SetGNetTarget (NetObject ,String("REMOTECLIENT :"+String(MilliSecs()))  )
				Local TargetString:String = String(GetGNetTarget (NetObject))
			If TargetString Print "ID : > "+TargetString+" <" 
		
		EndSelect 
		
	Next

EndIf

EndFunction

Function SendMSG()

		Local MSG		:TGNETOBject = CreateGNetMessage (_self)
		Local RCVClient:TGNETOBject '= _localclient
		
		For RCVClient = EachIn GNetObjects(_Self)
		
			If GNetObjectLocal (RCVClient) Print "MSG RCVR is LocalClient MSG not send !!" Continue
		
			SendGNetMessage (Msg,RCVCLient)
			
			Print "SEND"
			
		Next	
	
		
EndFunction 


thanks for any help !!

Hi,

GNetMessageObject returns the object the message was sent *TO*, which will always be a local object as far as the receiver is concerned.

There is no *from* mechanism to identify the sending object - you can implement this is you want using SetGNetXYZ on the message before sending it.

I suspect you are not using GNet the way it was designed - the message objects are meant to contain simple message like 'begin game', 'abort game' etc commands sent from the game server to all game objects.

For a more pure messaging API, try eNet.

Ok thx for your Awnser.

I do use Messages for Shoot's, i think messages have a greater chance to be received 100% from clients.

I handle Logins and Logouts with another solution. Each GnetObject become a Target if not Target exist the Object must be a new (a Login) Object and then it will be bind as a GameClient, Position etc. are transmitted with GnetSETXYZ and it works fine but when i use it for realy importent Messages like Shoots it doesn't work 100% also i think Messages are a the better way to send shoots btw. to send realy importent Messages.

But GnetMessages don't send a Referenz from where it come and in this case a Gnet User must write a SessionID system, then a Message do send a simple ID wich will be Identifikated a Client who have send a Message.

And now the a big WHY !

Why Messages don't send the GnetHost or the GnetObject from where it come. it can makes many things easier. In fact, a MessageObject is a standard GnetObject so i think IT MUST SEND a *from* ! :) !!

It doesn't exist a good Manuell for GNET only some Codes i can find to learn Gnet. In the process where i learn'd Gnet, i find it very good but this one stupid thing makes that i now write my on NetLib (i think time is Importent but running Code does have more Priority.) it's not a problem but the time :( , ok it's not hard work to Implement a ID system but it exist one and it identifikats Objects but not Messages this is not a good way and another problem is the UserManuell that doesn't exist for GNET then to know how work with Gnet you must know how work Gnet !


( i hope you can understand what i have write )


(if you want take a look how does it works atm. try this

http://www.c64.feuerware.com/new_hc/downloads/HC_nettest.rar

, change the Resolution to 500x500x32x2 (first 4 lines in settings)and start 2 Instances (ip and resolution can set in Settings.set , it runs very fine but now i must rewrite the NetLib )


bye C64.

I also have to say I think this would be a great feature. Why not give the ability to do such a thing in every way possible?