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:
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
Und hier die zwei beteiligten Funktionen:
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
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.
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)
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
Danke und Grüße
Norbert