4

我在 C# 多线程 Windows 服务中发送推送通知时遇到了一些麻烦。
当我向 APNS 发送大量通知时,一些线程会引发异常:

Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host.
   at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Security._SslStream.StartWriting(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security._SslStream.ProcessWrite(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.Write(Byte[] buffer) ...

我有一个由 16 个线程组成的线程池,每个线程都打开了与 Apple 的连接。
这不是超时,因为我尝试过:sslStream.WriteTimeout = 60000;
我也尝试过:Client.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.KeepAlive, false);

发送开始时连接未关闭。

编辑:我认为所有数据都已发送,Apple 突然关闭了连接。

你知道这个异常的起源吗?怎么解决?

如果需要,我可以给你一些代码。

非常感谢你的回答 !

4

5 回答 5

4

异常“现有连接被远程主机强行关闭”通常意味着您打开连接的另一台主机决定不再与您交谈。为此,它会发送一个设置了 RST 的 FIN,以从其末端关闭连接。

由于在您发送大量通知时会发生这种情况,因此该服务是否可能故意限制您以防止过载?

于 2011-03-16T20:46:38.420 回答
1

这与推送通知无关,但我最近在多线程应用程序中遇到了这个问题,因为我有一个在两个线程之间共享的套接字(一个用于发送数据,一个用于接收)。当接收线程在 socket.ReceiveFrom() 中阻塞时,发送线程试图在同一个套接字上发送数据。这导致我的应用程序中出现“远程主机强制关闭连接”错误。这可能是您应该考虑的事情。

我最终通过添加一些 WaitHandles 来解决我的问题,以使套接字连接线程安全。

于 2011-03-21T14:43:35.550 回答
1

可能是您有太多打开的连接,而苹果的服务器出于某种原因关闭了它们。尝试使用较少的连接数来查看问题是否仍然存在。

于 2011-03-22T20:03:28.357 回答
1

从 APNS-Sharp 我看到用户在传递错误的设备令牌时看到了这个错误 - http://code.google.com/p/apns-sharp/issues/detail?id=35

如果这不是答案,那么当您打开较少的线程时,您能否确认您的代码不起作用?或者当您发送少量数据时它是否有效?

顺便说一句,真的有必要同时打开 16 个连接吗?这似乎相当高。

于 2011-03-20T12:19:43.767 回答
0

没有解决方案,但我认为当没有更多数据发送时,Apple 会关闭连接以重用套接字。

为了避免错误,我现在使用增强的通知。

于 2011-07-04T18:24:17.953 回答