Das muss aber doch möglich sein, oder habe ich irgendwas in der Hilfe übersehen?!Wenn ein Server diese Funktion aufruft, wird die Verbindung ohne Hinweis an den Client geschlossen.
Client Problem
-
- Beiträge: 11
- Registriert: 18.10.2004 19:27
Client Problem
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:
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..
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..

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:
das kombiniert mit honk's vorschlag, dann kann nix mehr schiefgehen 
mfG
Tobi
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

mfG
Tobi
-
- Beiträge: 11
- Registriert: 18.10.2004 19:27
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!
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!
[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*
EDIT: ich muss mich echt zusammennehmen, das hier nicht zu löschen

sooo peinlich *argh*

Zuletzt geändert von bluejoke am 05.01.2005 23:34, insgesamt 1-mal geändert.
Windows XP Pro SP2 - PB 4.00Ich bin Ausländer - fast überall
- 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
@bluejoke

Code: Alles auswählen
If Chr(0) <> ""
Debug "Bluejoke hat Recht"
Else
Debug "Bluejoke ist im Irrtum"
EndIf

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.





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

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