In den anderen Themen von mir beschäftige ich mich ja mal wieder etwas mit den Netzwerkfunkionen.
Dabei beschäftige ich mich vor allem auch mit den Disconnect Events am Clienten. Die Vorlage von Dark und purefan nimmt einem da ja an sich alles ab.
Nur so aus Interesse wollte ich jetzt aber mal was testen, denn in der Hilfe steht unter "ReceiveNetworkData"
Ich wollte jetzt einfach mal zum Test auf einer bestehenden Verbindung ReceiveNetworkData() ausführen OHNE daß dort ein Event kam daß mich auf Dateneingang hinweist. Es liegen also keine Daten an. Nun dachte ich, daß dann einfach als Rückgabe NULL-Bytes angegeben werden. Aber nichts ist, die Funktion hängt.. Das Programm arbeitet nicht weiter (ich weiß nicht wie lange ob es beim Empfang von Daten weiter geht, noch nicht getestet).Rückgabewert
Gibt die Anzahl an empfangenen Bytes zurück. Ist das 'Ergebnis' gleich der 'DatenPufferLänge', dann sind noch mehr Daten zum Einlesen verfügbar.
Ist das Absicht oder ein Fehler?
Wann soll ReceiveNetworkData() denn dann bitte -1 übergeben? Denn wenn Daten anliegen werden die Daten ausgegeben, wenn nicht, also kein Event existiert, hängt die Routine.
Und was würde jetzt passieren, wenn sagen wir mal 100 Bytes anliegen, ich diese 100 Bytes auslesen und als Rückgabewert 100 erhalte. Laut hilfe bedeutet es, wenn der Rückgabewert gleich der Datenbuffer länge ist, noch Daten anliegen. Das tun sie dann ja nicht. An sich kein Problem wenn dann einfach beim nächsten auslesen -1 angegeben wird.
Code: Alles auswählen
;
; ------------------------------------------------------------
;
; PureBasic - Network (Client) example file
;
; (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Port = 6832
ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
Debug "verbindung aufgebaut"
*DatenPuffer = AllocateMemory(100)
Repeat
Debug "versuche daten zu empfangen"
Ergebnis = ReceiveNetworkData(ConnectionID, *DatenPuffer, 1)
Debug ergebnis
Delay(3000)
Until 0
Debug "schleife verlassen"
;MessageRequester("PureBasic - Client", "Client connected to server...", 0)
;SendNetworkString(ConnectionID, "An hello from a client !!! :-)")
;MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)
;CloseNetworkConnection(ConnectionID)
Else
MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
Debug "ende"
End
Code: Alles auswählen
; http://www.purebasic.fr/german/viewtopic.php?f=8&t=23777&hilit=disconnect
;http://www.purebasic.fr/english/viewtopic.php?f=12&t=42559
;http://www.purebasic.fr/german/viewtopic.php?f=8&t=23445&hilit=disconnect+client
;
;http://www.purebasic.fr/german/viewtopic.php?f=16&t=25348&p=300584&hilit=disconnect#p300584
;
; --- Include
IncludePath "C:\DATEN\Entwicklung.Purebasic.LocalCopy\Includes"
XIncludeFile "proceduren(2012).pbi"
XIncludeFile "proceduren(2012).ThreadVerwaltung.pbi"
IncludePath "C:\DATEN\Entwicklung.Purebasic.LocalCopy\FremdInludes"
; XIncludeFile "Hook_NetworkClientEvent.pbi"
IncludePath "C:\DATEN\Entwicklung.Purebasic.LocalCopy\Network"
XIncludeFile "NetStruct.pb"
XIncludeFile "NetIDVerwaltung.pbi"
XIncludeFile "NetProc.pbi"
XIncludeFile "NetThreadIncomingServerEvent.pbi"
XIncludeFile "NetGlobalVar.pbi"
Debug "start"
; --- Variablen
Port = 6832
; --- Konstanten
InitNetwork.i = Proc_InitNetwork()
;CreateNetworkServer.i = Proc_CreateNetworkServer(Port, #PB_Network_TCP)
CreateNetworkServer.i = Proc_CreateNetworkServer(Port, #PB_Network_TCP, global_MemoryBlockSize_NetIDIncomingDataBuffer, global_MemoryBlockSize_NetIDOutgoingDataBuffer, global_NetworkDataBufferSize)
If proc_IsInitNetwork()
Debug "ServerInit"
If CreateNetworkServer <> 0
Debug "Serverstart"
;proc_AddThread()
Thread = CreateThread(@thread_NetworkServerEvent(), 0)
;proc_AddThread()
;Thread = CreateThread(@thread_server_network_CopyBuffers(), 0)
Else
error(0,"Server konnte nicht erstellt werden.")
; !!! vernümpftige Fehlerroutinge einbauen.
EndIf
EndIf
Debug "Warte auf Programmende"
Delay(60000)
Debug "Ende"
End
Das paßt doch was nicht.
Kein Wunder, das bei meinem alten Code hin und wieder mal unerwartet was nicht klappt.
Nur daß es daran liegen könnte, hätte ich nicht gedacht.
so, nur mal dieser Code:
Code: Alles auswählen
;
; ------------------------------------------------------------
;
; PureBasic - Network (Server) example file
;
; (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Port = 6832
*Buffer = AllocateMemory(1000)
If CreateNetworkServer(0, Port)
MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)
Repeat
SEvent = NetworkServerEvent()
If SEvent
ClientID = EventClient()
Select SEvent
Case #PB_NetworkEvent_Connect
SpeicherPuffer.s = "Hallo"
Ergebnis = SendNetworkData(ClientID, @SpeicherPuffer, StringByteLength(SpeicherPuffer))
MessageRequester("PureBasic - Server", "A new client has connected !", 0)
Case #PB_NetworkEvent_Data
MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
ReceiveNetworkData(ClientID, *Buffer, 1000)
MessageRequester("Info", "String: "+PeekS(*Buffer), 0)
Case #PB_NetworkEvent_File
MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
Case #PB_NetworkEvent_Disconnect
MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connection...", 0)
Quit = 1
EndSelect
EndIf
Until Quit = 1
MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
CloseNetworkServer(0)
Else
MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf
End
Code: Alles auswählen
;
; ------------------------------------------------------------
;
; PureBasic - Network (Client) example file
;
; (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Port = 6832
ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
Debug "verbindung aufgebaut"
*DatenPuffer = AllocateMemory(100)
Delay(3000)
Repeat
Debug "versuche daten zu empfangen"
Ergebnis = ReceiveNetworkData(ConnectionID, *DatenPuffer, 10)
If Ergebnis > 0
PeekS(*DatenPuffer, 10)
Else
Debug "nix"
EndIf
Debug "Bytes = " + Str(ergebnis)
Delay(3000)
Until 0
Debug "schleife verlassen"
;MessageRequester("PureBasic - Client", "Client connected to server...", 0)
;SendNetworkString(ConnectionID, "An hello from a client !!! :-)")
;MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)
;CloseNetworkConnection(ConnectionID)
Else
MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
Debug "ende"
End
Das muß doch eher ein uralter Bug sein!
Denn ansonsten wußte mehr als deutlich in der Hilfe stehen:
Ok, denn zweiten Satz könnte man weg lassen in dem man einfach in der Hilfe den Teil mit "ddann sind noch mehr Daten zum Einlesen verfügbar"Auf gar keinen Fall darf man ReceiveNetworkData() aufrufen, wenn keine Daten mehr anliegen. Und wenn die empfangene Datenmenge gleich der Buffergröße ist, dann werft eine Münze ob ich noch mehr Daten einlesen wollt.
Auf jeden Fall weiß ich nun, warum es hin und wieder mal zu mir bisher unerklärlichen Stopps im Programmablauf kam. Überl übel.
Ich bin jetzt mal gespannt und hoffe das ich hier einfach nur komplett was falsch getestet habe und meine alten "Stopps" an etwas Anderem liegen.
Gruß
Toshy