Har ett program i Winsock som överför filer från Client till Server (hämtad från nätet) som jag vill modifiera lite. När jag trycker på "Koppla ned" på Clienten (fungerar) ska också Servern koppla ner, men det gör den inte. Försöker jag koppla upp igen så får jag "Forcefully rejected". Hej! Hej.... Enklaste sättet att är nog att kolla på socketens "state". Så här har Vet inte riktigt vad Enum är. Har testat så här nu på Servern:Göra en "reconnect" i Winsock program.
Koden under "Koppla ned" knappen:
Private Sub cmdClose_Click()
' If Sock.State <> sckClosed Then
' Do
' Sock.Close
' Loop Until Sock.State = sckClosed
FT.Disconnect
cmdConnect.Enabled = True
End Sub
FT är en klassmodul som anropas.
Hur ska jag koda på Server sidan? Har testat lite men inte fått det att fungera. Ska erkänna att jag har dålig koll på det här med klassmoduler (vad det är, när används det osv).
Går det inte att ha nåt liknande det här i Servern?
Private Sub Sock_Close() ' här vet jag inte riktigt vad jag ska skriva
' If Sock.State <> sckClosed Then
' Do
' Sock.Close
' Loop Until Sock.State = sckClosed
FT.Disconnect
MsgBox "Clienten har kopplat ner!", vbOKOnly
FT.Listen
End Sub
Winsocken heter Sock.
Har också läst att man får vänta ca: 4 min om man inte sätter Localport till 0, men man måste väl kunna stänga båda på en gång. Hoppas ni har fått lite hum om vad jag håller på med.Sv: Göra en "reconnect" i Winsock program.
För alla dina sockets lägg till sock.Close i både Close eventet och i Error eventet. Om din server bara har en socket, så måste du ta sock.Listen igen i båda close och error eventet.
Close eventet talar om att andra sidan har stängt förbindelsen och då ska du göra likadant.
Error eventet talar om att något har gått fel, då ska man stänga socketen.
Eftersom servern inte automatisk lyssnar efter nya connections efter att socketen är stängd måste du tala om för servern att göra det. Det gör du med socket.listen
//jonas - även client/server programmerare =)Sv: Göra en "reconnect" i Winsock program.
I FT.Disconnect så stängs Sock:eten, och i FT.Listen så lyssnar man på porten. Så det är väl det jag har gjort? Det fungerar bra under knappen på Clienten men i Servern händer det inget. Har kört debug och den verkar inte ta Private Sub Sock_Close() (händer iallafall ingenting där). Kanske skriver fel där.
Dem här finns i klassmodulen:
Public Sub Disconnect()
' close the socket
Sock.Close
End Sub
Public Sub Listen()
Sock.LocalPort = Me.Port
Sock.Listen
End Sub
Private Sub Class_Initialize()
Set Sock = New Winsock
End
Den här i formuläret:
Option Explicit
Dim WithEvents FT As clsFileTransfer
Så...jag vet inte riktigt...hur göra? Förslag?Sv: Göra en "reconnect" i Winsock program.
jag gjort i ett projekt och det fungerar. Servern stänger och lägger sig i
lyssningsläge efteråt.
Private Sub sckHS1_Close()
'If the socket is closed and the state = 8, peer closed
'Then reset the socket and listen.
If sckHS1.State = sckState.sckClosing Then
MsgBox "Socket was closed by peer.", vbOKOnly, "Socket closed"
sckHS1.Close
sckHS1.Listen
End If
End Sub
För att detta skall fungera måste du lägga till en basModul som du gör en
public enum deklaration i enligt följande:
Public Enum sckState
sckClosed = 0 'Closed
sckOpen = 1 'Open
sckListening = 2 'Listening
sckConnectionPending = 3 'Connection pending
sckResolvingHost = 4 'Resolving host
sckHostResolved = 5 'Host resolved
sckConnecting = 6 'Connecting
sckConnected = 7 'Connected
sckClosing = 8 'Peer is closing the connection
sckError = 9 'Error
End Enum
/[peter.h]Sv: Göra en "reconnect" i Winsock program.
Private Sub FT_Close() ' här vet jag inte riktigt vad jag ska skriva
FT.Disconnect
MsgBox "Clienten har kopplat ner!", vbOKOnly
FT.Listen
End Sub
...men det funkar inte.
Om jag kör en koll på om socketen är stängd eller ej i Sub:en vad ska jag då skriva? Så här??
If Sock.State <> sckClosed Then
Do
Sock.Close
Loop Until Sock.State = sckClosed
..men då är frågan om den ska heta Sock.State. Eller?