Ich hatte Freak schon mal in einem Beitrag angesprochen, aber er hatte wohl noch keine Zeit da nochmals reinzuschauen.
Da mein Englisch zu schlecht ist kann ich Fred nicht direkt fragen.
Ich versuche eine optimale Netzwerkroutine zu entwickeln. Das große Problem dabei ist wenn man mit vielen Clienten verbunden ist diese zu verwalten. Man muß wenn ein Event ankommt (am Server) die ClientID in einer Verwaltung suchen und dann entsprechendes Auslösen. Was bei wenigen Clienten noch schnell geht, iost ab spätestens 1000 Clienten so langsam, das das PRogremm einschläft. Das liegt in erster Linie daran das man je Event die Veraltung durchlaufen muß. Schneller geht es wenn man einen errerchenbaren Index verwendet, das geht aber nicht so einfach, ich komme dem aber schon recht nahe.
Nun ist mir aber in den Sinn gekommen, da die ClientID von PB NICHT der SystemID /Socket gleicht, das PB dann auch bei JEDEM Event das ankommt selbst erst in einer Verwaltung suche muß welche Socket welcher ClientID zuzuordnen ist bevor es dem PBuser übermittelt wird. Dies scheint so zu sein, wenn dem aber wirklich so ist, dann macht es einem unmöglich richtig Leistungsfähige Netzwerkprogramme zu schreiben ohne die Socketprogrammierung wieder selbst zu übernehmen.
Vielleicht kann Andre oder jemand anders der englisch spricht Fred mal danach fragen.
Ich habe mal per LoopBackadresse (127.0.0.1) auf meinem WinXP rechner bis zu 3000 Verbindungen erstellt. Anfangs ging das senden von Daten (1Byte") noch schnell, aber um so mehr ClientID`s existierten um so langsamer wurde alles. Und nach bisherigen Tests (in meinen anderen Codes und Programmen) hat das weniger damit zu tun, das viele Netzwerkverbindungen existierten, sondern vor allem mit der ClientIDverwaltung von PB.
Es wäre nett, wenn dieses Grundlegende Anliegen mit eurer Hilfe gelöst werden kann oder besser gesagt bestätigt oder widerlegt wird.
Es wäre halt schade wenn man die Socketprogrammierung selbst übernehmen müßte (kenne mich da so gut wie nicht aus, lese da gerade ein wenig).
Code: Alles auswählen
OpenConsole()
InitNetwork()
sid = CreateNetworkServer(#PB_Any,5555)
PrintN("ServerID="+Str(sid))
ConnectionIDold.l
ConnectionIDold_c.l
*DatenBuffer = AllocateMemory(1000)
For i = 1 To 3000
s = ElapsedMilliseconds()
cid = OpenNetworkConnection("127.0.0.1",5555)
;PrintN("ClientID_c("+Str(i)+")="+Str(cid))
Debug "ClientID_c("+Str(i)+")="+Str(cid)
If cid > 0
;PrintN("ConnectionID_c_("+Str(i)+")="+Str(ConnectionID(cid)) +"|diffConn="+ Str( ConnectionID(cid)-ConnectionIDold ) )
Debug "ConnectionID_c_d("+Str(i)+")="+Str(ConnectionID(cid)) +"|diffConn="+ Str( ConnectionID(cid)-ConnectionIDold )
ConnectionIDold = ConnectionID(cid)
EndIf
;
;Repeat
NetworkServerEvent.b = NetworkServerEvent()
If NetworkServerEvent > 0
ServerId.l = EventServer()
ClientID.l = EventClient()
string.s = "ConnectionID_S("+Str(0)+")="+Str(ConnectionID(ClientID)) +"|diffConn="+ Str( ConnectionID(ClientID)-ConnectionIDold_c ) +"|timer="+Str(ElapsedMilliseconds()-s)
;PrintN(string)
ConnectionIDold_c = ConnectionID(ClientID)
;Delay(1000)
EndIf
;Debug NetworkServerEvent
;Until NetworkServerEvent = 0
If i = 1 Or i = 500 Or i = 1000 Or i = 1500 Or i = 2000 Or i = 2500 Or i = 3000
Delay(100)
If cid > 0
s = ElapsedMilliseconds()
For t =1 To 100
SendNetworkString(cid, "x")
NetworkServerEvent.b = NetworkServerEvent()
If NetworkServerEvent > 0
ServerId.l = EventServer()
ClientID.l = EventClient()
If NetworkServerEvent = #PB_NetworkEvent_Data
ReceiveNetworkData(ClientID, *DatenBuffer, 10)
EndIf
EndIf
Next t
string.s = "SendData -> |timer="+Str(ElapsedMilliseconds()-s)
PrintN(string)
Delay(10000)
EndIf
EndIf
Delay(10)
Next i
Delay(120000)
CloseConsole()
GrußServerID=3546776
SendData -> |timer=63
SendData -> |timer=281
SendData -> |timer=641
SendData -> |timer=2562
SendData -> |timer=1891
SendData -> |timer=4562
......
Toshy