Announcement

Collapse
No announcement yet.

IO Exception im TcpClient

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • IO Exception im TcpClient

    Guten Abend,
    seit Tagen schlage ich mit einem Problem herum und kann es nicht lösen. Vielleicht schaut mal wieder einer in dieses Forum rein. Ohne euch Profis wäre ich (wie schon öfter) absolut aufgeschmissen

    mein TcpClient wirft bei grossen Mails (über 2 MB) eine Exception:
    System.IO.IOException: Von der Übertragungsverbindung können keine Daten gelesen werden: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat. ---> System.Net.Sockets.SocketException: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat bei System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) bei System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) --- Ende der internen Ausnahmestapelüberwachung --- bei System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) bei KvSafenet.CConnection.WaitforAnswer(TcpClient tcpClient, String& strRet) in D:\VBEntwicklung\ML5.1.0.1\KvSafenet\CConnection.v b:Zeile 254.
    Kleinere Mails werden problemlos verarbeitet. Komisch ist, dass der Fehler beim schrittweisen Durchgehen (Debuggen) der Funktion WaitforAnswer (s.u.) nicht auftritt. Hab schon den Buffer von 1024 auf 2048 erhöht (immer noch zu wenig?) und ein Sleep eingebaut. Alles hilft nicht.

    Der Aufruf kommt von
    Code:
            tcpClient = New TcpClient(AddressFamily.InterNetwork)
            tcpClient.ReceiveTimeout = 1000
            ...
            If InlineAssignHelper(strErr, SendText(tcpClient, "RETR " & number & Environment.NewLine)).Length > 0 Then
                   Continue For
            Else                                                                                    'Daten sind in einer Mail
                   InlineAssignHelper(strErr, WaitforAnswer(tcpClient, strRet))
                   listRet.Add(strRet)
    Und hier die zwei beteiligten Funktionen:
    Code:
        Private Function WaitforAnswer(tcpClient As TcpClient, ByRef strRet As String) As String
            'der Verbindungssocket
            Dim iRead As Integer
            Dim buf As Byte() = New Byte(2047) {}
            Dim bufRet As Byte() = New Byte(-1) {}
            Dim bufTemp As Byte()
            Dim strErr As String = ""
    
            strRet = ""
            Try
                Thread.Sleep(1000)
                While True
                    If InlineAssignHelper(iRead, tcpClient.GetStream().Read(buf, 0, buf.Length)) <> 0 Then
                        bufTemp = New Byte(bufRet.Length + (iRead - 1)) {}
                        bufRet.CopyTo(bufTemp, 0)
                        For idx As Integer = 0 To iRead - 1
                            bufTemp(bufRet.Length + idx) = buf(idx)
                        Next
                        bufRet = bufTemp
                    End If
                    If iRead < 2048 Then
                        strRet = Text.Encoding.UTF8.GetString(bufRet)
                        Return ""
                    End If
                End While
            Catch exc As SocketException
                strErr = exc.ToString()
            Catch exc1 As Exception
                strErr = exc1.ToString()
            End Try
            Return strErr
        End Function
    
        Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T
            target = value
            Return value
        End Function
    An welchen Stellschrauben könnte ich rumschrauben? Hab den tcpClient.ReceiveTimeout schon auf 2000 erhöht. Hat nichts gebracht. Weiss jemand Rat?
    Danke und Grüße
    Norbert
Working...
X