Client Problem

Für allgemeine Fragen zur Programmierung mit PureBasic.
Der Fleckenzwerg
Beiträge: 11
Registriert: 18.10.2004 19:27

Client Problem

Beitrag 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?!
honk
Beiträge: 6
Registriert: 20.09.2004 18:57
Wohnort: leider hier
Kontaktdaten:

Beitrag 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:
Benutzeravatar
ChaOsKid
Beiträge: 66
Registriert: 29.08.2004 15:07
Wohnort: Oktoberfest

Beitrag 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
Der Fleckenzwerg
Beiträge: 11
Registriert: 18.10.2004 19:27

Beitrag 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!
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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:
Zuletzt geändert von bluejoke am 05.01.2005 23:34, insgesamt 1-mal geändert.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@bluejoke

Code: Alles auswählen

If Chr(0) <> ""
  Debug "Bluejoke hat Recht"
Else
  Debug "Bluejoke ist im Irrtum"
EndIf
:lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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
Zuletzt geändert von bluejoke am 05.01.2005 23:33, insgesamt 1-mal geändert.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Beitrag von Kekskiller »

Da wird man ja ganz blau vor lachen *hohohoh* ...
Der Fleckenzwerg
Beiträge: 11
Registriert: 18.10.2004 19:27

Beitrag 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 ?
Antworten