C# mailkit imap idle reconnect 连接由对等重置
C# mailkit imap idle reconnect connection reset by peer
当连接到 gmail imap 服务器时,github 页面上的示例程序在 9 分钟后因 imap 闲置而抛出连接重置。
运行 raspberry Pi 3 上的 dotnet 核心控制台应用已连接到移动热点互联网连接
该代码适用于任何其他网络或电脑。
仅当树莓派连接到移动热点时它不工作
代码在第一次连接时工作正常。它只会在这个单一功能上中断并抛出由对等方重置的连接
private void IdleLoop(object state) {
IdleState idle = (IdleState) state;
lock (idle.Client.SyncRoot) {
while (!idle.IsCancellationRequested) {
using (CancellationTokenSource timeout = new CancellationTokenSource()) {
using (Timer timer = new Timer(9 * 60 * 1000)) {
timer.Elapsed += (sender, e) => timeout.Cancel();
timer.AutoReset = false;
timer.Enabled = true;
try {
idle.SetTimeoutSource(timeout);
if (idle.Client.Capabilities.HasFlag(ImapCapabilities.Idle)) {
//TODO ERROR
idle.Client.Idle(timeout.Token, idle.CancellationToken);
}
else {
Logger.Log("Issuing NoOp command to IMAP servers...");
idle.Client.NoOp(idle.CancellationToken);
WaitHandle.WaitAny(new[] { timeout.Token.WaitHandle, idle.CancellationToken.WaitHandle });
Logger.Log("NoOp completed!");
}
}
catch (OperationCanceledException) {
break;
}
catch (ImapProtocolException) {
break;
}
catch (ImapCommandException) {
break;
}
finally {
idle.SetTimeoutSource(null);
}
}
}
}
}
}
移动热点不是可靠的互联网连接,因此您会收到 "connection reset by peer" 错误。
您可以尝试减少超时持续时间,但最终,您需要做的是 re-connect 当您收到该错误时(这是不可避免的 - 即使在更可靠的互联网连接上也可能发生)。
当连接到 gmail imap 服务器时,github 页面上的示例程序在 9 分钟后因 imap 闲置而抛出连接重置。 运行 raspberry Pi 3 上的 dotnet 核心控制台应用已连接到移动热点互联网连接
该代码适用于任何其他网络或电脑。 仅当树莓派连接到移动热点时它不工作
代码在第一次连接时工作正常。它只会在这个单一功能上中断并抛出由对等方重置的连接
private void IdleLoop(object state) {
IdleState idle = (IdleState) state;
lock (idle.Client.SyncRoot) {
while (!idle.IsCancellationRequested) {
using (CancellationTokenSource timeout = new CancellationTokenSource()) {
using (Timer timer = new Timer(9 * 60 * 1000)) {
timer.Elapsed += (sender, e) => timeout.Cancel();
timer.AutoReset = false;
timer.Enabled = true;
try {
idle.SetTimeoutSource(timeout);
if (idle.Client.Capabilities.HasFlag(ImapCapabilities.Idle)) {
//TODO ERROR
idle.Client.Idle(timeout.Token, idle.CancellationToken);
}
else {
Logger.Log("Issuing NoOp command to IMAP servers...");
idle.Client.NoOp(idle.CancellationToken);
WaitHandle.WaitAny(new[] { timeout.Token.WaitHandle, idle.CancellationToken.WaitHandle });
Logger.Log("NoOp completed!");
}
}
catch (OperationCanceledException) {
break;
}
catch (ImapProtocolException) {
break;
}
catch (ImapCommandException) {
break;
}
finally {
idle.SetTimeoutSource(null);
}
}
}
}
}
}
移动热点不是可靠的互联网连接,因此您会收到 "connection reset by peer" 错误。
您可以尝试减少超时持续时间,但最终,您需要做的是 re-connect 当您收到该错误时(这是不可避免的 - 即使在更可靠的互联网连接上也可能发生)。