Seite 1 von 1
Client Problem
Verfasst: 05.01.2005 11:50
von Der Fleckenzwerg
mmh...sorry Jungs & Mädels, wenn das hier 'ne dämliche n00b Frage ist, aber wie kann ich in meinem Client Programm herausfinden, ob die Verbindung bereits serverseitig getrennt wurde? In der PB Hilfe hab ich nix gefunden, ausser unter CloseNetworkConnection:
Wenn ein Server diese Funktion aufruft, wird die Verbindung ohne Hinweis an den Client geschlossen.
Das muss aber doch möglich sein, oder habe ich irgendwas in der Hilfe übersehen?!
Verfasst: 05.01.2005 13:14
von honk
hi Fleckenzwerg,
Du hast nichts übersehen, einen PB-Befehl dafür gibt es nicht,
also muss dein Server deinem Client eine Nachricht mit
SendNetworkData() schicken,
bevor er
CloseNetworkServer() aufruft.
Sobald dein Client diese Nachricht erhält weiss er ja bescheid.
Wie diese Nachricht allerdings auszusehen hat musst du natürlich selbst bestimmen.
Das kann z.B. ein Byte mit einer bestimmten Zahl sein, oder ein String, aber das wäre ja brutal..

Verfasst: 05.01.2005 14:36
von ChaOsKid
hi Fleckenzwerg,
wenn der client einem toten server daten schickt,
dann ist der rückgabewert von SendNetworkData() = -1
die fehlerursache bekommt man dann mit WSAGetLastError_() raus.
hier ein kleines beispiel:
Code: Alles auswählen
InitNetwork()
CreateNetworkServer(3000)
ConnectionID = OpenNetworkConnection("127.0.0.1", 3000)
CloseNetworkServer()
ret = SendNetworkString(ConnectionID, "test")
Debug ret
If ret = #SOCKET_ERROR
Select WSAGetLastError_()
Case #WSANOTINITIALISED
Debug "Wsa not initialized"
Case #WSAENETDOWN
Debug "The Windows Sockets implementation has detected that the network subsystem has failed."
Case #WSAENOTCONN
Debug "Socket not connected."
Case #WSAEINTR
Debug "The (blocking) call was canceled using WSACancelBlocking"
Case #WSAEINPROGRESS
Debug "A blocking Windows Sockets operation is in progress."
Case #WSAENOTSOCK
Debug "The descriptor is not a socket."
Case #WSAEOPNOTSUPP
Debug "MSG_OOB was specified, but the socket is not of type SOCK_STREAM."
Case #WSAESHUTDOWN
Debug "The socket has been shut down; it is not possible to recv on a socket after shutdown has been invoked with how set to 0 or 2."
Case #WSAEMSGSIZE
Debug "The datagram was too large to fit into the specified buffer and was truncated."
Case #WSAEINVAL
Debug "The socket has not been bound with bind."
Case #WSAECONNABORTED
Debug "The virtual circuit was aborted due to timeout or other failure."
Case #WSAECONNRESET
Debug "The virtual circuit was reset by the remote side."
Case #WSAEWOULDBLOCK
Debug "The socket is marked as nonblocking"
EndSelect
EndIf
das kombiniert mit honk's vorschlag, dann kann nix mehr schiefgehen
mfG
Tobi
Verfasst: 05.01.2005 23:02
von Der Fleckenzwerg
Danke für die Antworten.
Ich beschäftige mich im Moment mit dem FTP Protokoll, und da wird das Ende einer Datei damit gekennzeichnet, dass die Verbindung unterbrochen wird. Erstere Lösung käme also nicht in Frage, trotzdem danke honk. Warscheinlich sollte ich es einfach probieren, aber funktioniert der Trick mit dem Rückgabewert auch, wenn ich ein Chr(0) senden will ?! Naja, bin jetzt zu faul das zu checken, auch danke für deine Antwort Chaoskid, hat mir echt weitergeholfen!
// Nachrag:
Mit SendNetworkString(CID, "") geht's nicht, das gibt immer 0 zurück, aber folgendermaßen geht es:
buffer = AllocateMemory(1)
PokeS(buffer, Chr(0))
ret = SendNetworkData(CID.l, buffer, 1)
Vielen Dank nochmal!
Verfasst: 05.01.2005 23:23
von bluejoke
[EDIT: man stelle sich einen dicken fetten roten Strich vor, der das folgende total überstreicht!] Chr(0) und "" sind nicht dasselbe, du musst also wenndann schon SendNetworkString(CID, Chr(0)) schreiben
EDIT: ich muss mich echt zusammennehmen, das hier nicht zu löschen

sooo peinlich *argh*

Verfasst: 05.01.2005 23:29
von ts-soft
@bluejoke
Code: Alles auswählen
If Chr(0) <> ""
Debug "Bluejoke hat Recht"
Else
Debug "Bluejoke ist im Irrtum"
EndIf

Verfasst: 05.01.2005 23:30
von bluejoke
Verfasst: 05.01.2005 23:32
von Kekskiller
Da wird man ja ganz blau vor lachen *hohohoh* ...
Verfasst: 06.01.2005 13:37
von Der Fleckenzwerg
omg...jungs, ich komme leider immernoch nicht klar. folgender code sollte alles, was über die verbindung cid_data.l ankommt in die datei file.s schreiben, solange bis die verbindung cid_data.l unterbrochen wird.
Code: Alles auswählen
Procedure.b CheckConnectionAlive(C_ID.l)
nbuffer = AllocateMemory(1)
PokeB(nbuffer, 0)
If SendNetworkData(C_ID.l, nbuffer, 1) = -1
ProcedureReturn 0
Else
ProcedureReturn 1
EndIf
FreeMemory(nbuffer)
EndProcedure
OpenFile(0, file.s)
Repeat
CEvent.l = NetworkClientEvent(cid_data.l)
If CEvent.l = 2
Debug ReceiveNetworkData(cid_data.l, fbuffer, 1024)
WriteData(fbuffer, 1024)
EndIf
Delay(20)
Until CheckConnectionAlive(cid_data.l) = 0
wobei die Verbindung cid_data.l schon erstellt worden ist, und file.s den dateinamen enthält.
Die Schleife wird auch verlassen, sobald die Verbindung unterbrochen wird. Interessant ist jetzt aber, dass ReceiveNetworkData immer -1 zurück gibt (siehe Debug Window), und fbuffer leer bleibt. Ersetze ich die letzte Zeile mit der Abbruchbedingung durch ForEver, kann ReceiveNetworkData wieder ganz normal die Daten empfangen, und die Datei wird korrekt geschrieben. Offensichtlich liegt das Problem also bei CheckConnectionAlive, weiß jemand, was hier vorgeht bzw. weiß jemand, wie ich das Problem umgehen könnte ?