簡體   English   中英

讀取和解碼SSL消息的循環不起作用

[英]Loop for reading and decoding SSL message doesn't work

我有這個循環來讀取和解碼SSL消息:

byte[] buffer = new byte[2048];
StringBuilder messageData = new StringBuilder();
int bytes = -1;
// Works well to this moment
do
{
    bytes = sslStream.Read(buffer, 0, buffer.Length);
    Decoder decoder = Encoding.UTF8.GetDecoder();
    char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
    decoder.GetChars(buffer, 0, bytes, chars, 0);
    messageData.Append(chars);

    if (messageData.ToString().IndexOf("<EOF>") != -1)
        break;
} while (bytes != 0);
Console.Write(messageData.ToString());

當我調試它時,我在“本地”選項卡中看到messageData的值為+OK Gpop ready for requests from xxx.xx.xx.xx p49mb48176339eey ,但是循環不起作用,消息也不會打印到控制台。 有人可以幫我嗎? 如果您想測試完整代碼,請訪問: github.com/WizzieP/MailerPrototype

您的代碼的問題在於,直到關閉與服務器的連接,網絡TCP流(以及位於其頂部的SSL流)才從Read()返回0。

因此,您需要使用其他方式來確定是否已讀取所有數據。

在您的情況下,由於您正在嘗試讀取POP3服務器的問候語,因此您要做的是保持循環,直到您讀取了"\\r\\n"序列為止(也可以簡單地檢查“ \\ n” )。

當您執行CAPA,UIDL,STAT,TOP和RETR命令時,您將要繼續循環,直到收到"\\r\\n.\\r\\n"為止。

如果您想了解有關此操作的一些高級技術,請隨時在https://github.com/jstedfast/MailKit/blob/master/MailKit/Net/Pop3/Pop3Stream.cs#L394 (行號可能會更改,但要查找Read (byte[] buffer, int offset, int count, CancellationToken cancellationToken)方法。

此方法的作用是防止該流的使用者讀取超出對諸如RETR和TOP之類的命令的響應的結尾。 這樣做時,它還會對從網絡中讀取的數據進行非字節填充(POP3服務器將在RETR和TOP響應中以'.'開頭的每一行之前加一個'.'來“字節填充” '.' ),這樣使用者就可以像讀取磁盤中的原始消息一樣簡單地讀取流,而不必擔心處理任何流。

為此,您會注意到Pop3Stream緩沖數據。 這就是ReadAhead()方法所負責的。

所有這些都是為了讓我可以直接從套接字中或多或少地解析消息,而不是在解析之前將所有數據讀入1個大StringBuffer中: https : //github.com/jstedfast/MailKit/blob/master /MailKit/Net/Pop3/Pop3Client.cs#L1275

在這與我的MIME解析器逐步解析消息(而不是將整個消息讀入1個大StringBuffer)這一事實之間,與其他所有.NET POP3庫相比,我的代碼是如此之快。

祝好運!

我刪除了循環和一些代碼,它起作用了。 我從stackoverflow的答案中獲取了代碼,所以很驚訝它沒有用。 這是我的新代碼:

byte[] buffer = new byte[2048];
StringBuilder messageData = new StringBuilder();
int bytes = 0;
bytes = sslStream.Read(buffer, 0, buffer.Length);
Decoder decoder = Encoding.UTF8.GetDecoder();
char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
decoder.GetChars(buffer, 0, bytes, chars, 0);
messageData.Append(chars);

Console.Write(messageData.ToString());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM