lefsaker Skrevet 18. mars 2010 Del Skrevet 18. mars 2010 Jobber for tiden med å konvertere et socketprosjekt fra VB6 til VB.net, men sliter litt med å finne ut hvordan jeg stenger sockets uten å kræsje "andre enden" Om jeg lukker en klient, kræsjer serveren, og alle tilkoblede klienter. Om jeg lukker serveren, kræsjer alle klienter. Kode på klientsiden som kræsjer om jeg lukker serveren (kommentert linje nr. 4 fra bunnen): For infiniteCounter = 1 To 2 infiniteCounter = 1 serverStream = clientSocket.GetStream() Dim buffSize As Integer Dim inStream(10024) As Byte buffSize = clientSocket.ReceiveBufferSize serverStream.Read(inStream, 0, buffSize) 'Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. Dim returndata As String = System.Text.Encoding.ASCII.GetString(inStream) readData = "" + returndata Next Kode på serversiden som kræsjer om jeg lukker en klient: Dim infiniteCounter As Integer Dim requestCount As Integer Dim bytesFrom(10024) As Byte Dim dataFromClient As String Dim sendBytes As [byte]() Dim serverResponse As String Dim rCount As String requestCount = 0 For infiniteCounter = 1 To 2 infiniteCounter = 1 Try requestCount = requestCount + 1 Dim networkStream As NetworkStream = clientSocket.GetStream() networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize)) dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom) dataFromClient = _ dataFromClient.Substring(0, dataFromClient.IndexOf("$")) rCount = Convert.ToString(requestCount) msg(clNo + ": " + dataFromClient) If dataFromClient.Contains(".say ") Then vox.Speak(dataFromClient.Replace(".say ", "")) Else End If broadcast(dataFromClient, clNo, True) Catch ex As Exception MsgBox(ex.ToString) End Try Next Linje 13 og 14: Dim networkStream As NetworkStream = clientSocket.GetStream() networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize)) Feilmeldinger på serversiden er lagt med som vedlegg. Hva gjør jeg? :O Lenke til kommentar
GeirGrusom Skrevet 18. mars 2010 Del Skrevet 18. mars 2010 Du kan jo bare ta imot exceptionen med try/catch. En får ikke feil før en prøver å lese/skrive neste gang etter at koblingen er lukket. Litt off-topic burde du bruke regex (System.Text.RegularExpressions) til å parse tekstdataene som kommer inn. Da slipper du å tenke på IndexOf og lignende, og det blir mye enklere å utvide syntaksen som brukes dersom det blir nødvendig. Det forutsetter dog at du lærer deg regex (dersom du ikke kan det fra før) og det ser vanskelig ut, men er i virkeligheten temmelig simpelt. Lenke til kommentar
lefsaker Skrevet 19. mars 2010 Forfatter Del Skrevet 19. mars 2010 (endret) Ah, nydelig. Visste ikke om den funksjonen Fungerte flott Hjertlig takk Endret 19. mars 2010 av lefsaker Lenke til kommentar
lefsaker Skrevet 19. mars 2010 Forfatter Del Skrevet 19. mars 2010 (endret) Fikk da et nytt problem Hele applikasjonen henger seg opp i 1 sekund hver gang den skal prøve å sjekke info. Endret 19. mars 2010 av lefsaker Lenke til kommentar
GeirGrusom Skrevet 19. mars 2010 Del Skrevet 19. mars 2010 Hømmm jeg tror ikke den gjør det under release, men uansett må du nesten bare steppe og se hvor den fryser. Lenke til kommentar
lefsaker Skrevet 21. mars 2010 Forfatter Del Skrevet 21. mars 2010 (endret) Nytt problem: Når en klient kobler fra, prøver jo serveren fremdeles hele tiden å lytte på info fra den. Dette har ikke noen innvirkning på hvordan serveren behandler informasjonen, men jeg blir floodet med følgende meldinger i VS-error-list så lenge serveren kjører: A first chance exception of type System.InvalidOperationExeption occured in System.dll Jeg kan tenke meg at dette kan ta litt av når antall frakoblinger øker. Hvordan stenger jeg socketen uten å kaste ut andre tilkoblede klienter? Ser at andre har samme problem her: http://www.vbdotnetforums.com/net-sockets/39587-close-tcp-connection.html http://www.vbforums.com/showthread.php?t=575643 http://www.a1vbcode.com/a1vbcode/vbforums/Topic28834-9-1.aspx Endret 21. mars 2010 av lefsaker Lenke til kommentar
GeirGrusom Skrevet 23. mars 2010 Del Skrevet 23. mars 2010 Vet ikke om dette har noe å si for deg, men kanskje dette er løsningen: For connection-oriented protocols, it is recommended that you call Shutdown before calling the Close method. This ensures that all data is sent and received on the connected socket before it is closed. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå