Avatar billede zapzie Nybegynder
07. september 2005 - 09:35 Der er 14 kommentarer og
1 løsning

System.ArgumentOutOfRangeException ved brug af Socket.Receive

Jeg bruger følgende kode til at modtage objecter, men det virker ikke helt for mig...

Dim received(1024) As Byte
While True
  Dim bytesReceived As Integer = sock.Receive(received, sock.Available, SocketFlags.None)
  Try
    If bytesReceived > 0 Then
      Dim ao As AsteriskObject = ByteArray2Object(received)
      eventHandler.recieveAsteriskObjectEvent(ao)
    End If
  Catch ex As Exception
    MsgBox("Serialization Error occured! :" + ex.Message)
  End Try
End While

når programmet kører får jeg følgende exception:

An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in system.dll

Additional information: Det angivne argument lå uden for det gyldige værdiområde.

Hvis jeg udskriver retur-værdien af socket.Send(...) ligger den mellem 200 - 400, altså ikke i nærheden af 1024.

Jeg har brugt ghorfraq's kode fra http://eksperten.dk/spm/407819 og skrevet det om til vb .net...
Avatar billede arne_v Ekspert
07. september 2005 - 10:22 #1
får du ikke at vide i hvilken linie fejlen sker ?
Avatar billede zapzie Nybegynder
07. september 2005 - 10:23 #2
Dim bytesReceived As Integer = sock.Receive(received, sock.Available, SocketFlags.None)
Avatar billede arne_v Ekspert
07. september 2005 - 10:25 #3
og hvad returnerer sock.Available ?
Avatar billede arne_v Ekspert
07. september 2005 - 10:26 #4
jeg ville nok kalde med received.Length
Avatar billede zapzie Nybegynder
07. september 2005 - 10:26 #5
sock.Available = The number of bytes to receive
Avatar billede arne_v Ekspert
07. september 2005 - 10:29 #6
jeg ved godt hvad den betyder

men hvilken værdi har den ?

0 ? -1 ? 1-1024 ? >1024 ?
Avatar billede zapzie Nybegynder
07. september 2005 - 10:31 #7
ca 8000
Avatar billede zapzie Nybegynder
07. september 2005 - 10:33 #8
med received.Length, får den nogle pakker fint og kan deserialize pakken fint. Men nogle gange tager den 1024 bytes, og så kan den ikke deserialize.
Men fejlen System.ArgumentOutOfRangeException er væk nu.
Avatar billede arne_v Ekspert
07. september 2005 - 10:33 #9
tja - du beder den læse 8000 byes ind i 1024 bytes !
Avatar billede arne_v Ekspert
07. september 2005 - 10:33 #10
måske skulle du gøre bufferen større end 1024 bytes !

:-)
Avatar billede zapzie Nybegynder
07. september 2005 - 10:46 #11
Vis jeg sætter bufferstørrelsen op, får den kun de to første pakker ud af mange.
Avatar billede arne_v Ekspert
07. september 2005 - 11:06 #12
skal du ikke undre alle omstændigheder have en mekanisme til at splitte bytesene
op i hvad der hører til samme objekt ?

medmindre du altså vælger at lade derialiseringen læse direkte fra socket
Avatar billede zapzie Nybegynder
07. september 2005 - 11:34 #13
Jo. Det skal jeg åbenbart.
Det kan gøres sådan:

Shared Function ByteArray2Objects(ByVal theByteArray As Byte(), ByVal bytesReceived As Integer) As ArrayList
    Dim objects As New ArrayList
    Dim ms As MemoryStream = New MemoryStream(theByteArray)
    Dim bf As BinaryFormatter = New BinaryFormatter
    ms.Position = 0
    While ms.Position < bytesReceived
        objects.Add(bf.Deserialize(ms))
    End While
    Return objects
End Function

Smider du lige et svar?
Avatar billede arne_v Ekspert
07. september 2005 - 11:48 #14
kommer her
Avatar billede zapzie Nybegynder
07. september 2005 - 11:53 #15
Og tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester