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.. :lol:

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* :oops:

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
:lol:

Verfasst: 05.01.2005 23:30
von bluejoke
:oops: :oops: :oops: :oops:
uuuuups!
das war war wohl wieder ein Post, bei dem mein Gehirn zu spät angesprungen ist...


soo nett hat mir das aber noch niemand gesagt... Das wars wert :D

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 ?