Gå til innhold

VB.net stengning av sockets


Anbefalte innlegg

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

post-105097-1268924614,8879_thumb.png

post-105097-1268924621,9357_thumb.png

Lenke til kommentar
Videoannonse
Annonse

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

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 av lefsaker
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...