C# ';远程主机';当发送大量数据时
我在C#多线程windows服务中发送推送通知时遇到一些问题。C# ';远程主机';当发送大量数据时,c#,multithreading,threadpool,apple-push-notifications,socketexception,C#,Multithreading,Threadpool,Apple Push Notifications,Socketexception,我在C#多线程windows服务中发送推送通知时遇到一些问题。 当我向APN发送大量通知时,一些线程抛出异常: 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 s
当我向APN发送大量通知时,一些线程抛出异常:
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)代码>
发送开始时连接未关闭。
编辑:我认为所有数据都已发送,苹果突然关闭了连接
你知道这个例外的起源吗?
如何解决
如果需要,我可以给你一些代码
非常感谢你的回答 例外情况“现有连接被远程主机强制关闭”通常意味着您打开连接的另一台主机决定不再与您通话。为此,它发送一个设置了RST的FIN,以从其末端关闭连接
由于这是在您发送大量通知时发生的,服务是否可能故意限制您以防止过载 从APNS Sharp,我看到用户在传递坏设备令牌时看到了这个错误-
如果这不是答案,那么当你打开更少的线程时,你能确认你的代码不工作吗?或者,当您发送的数据量较小时,它会起作用吗
另外,是否真的有必要同时打开16个连接?这似乎很高 这与推送通知无关,但我最近在一个多线程应用程序中遇到了这个问题,因为我有一个套接字在两个线程之间共享(一个用于发送数据,一个用于接收数据)。当接收线程在socket.ReceiveFrom()中阻塞时,发送线程试图在同一套接字上发送数据。这导致应用程序中出现“远程主机强制关闭连接”错误。这可能是你应该关注的事情
最后,我通过添加一些WaitHandles来解决我的问题,使套接字连接线程安全。可能是因为您有太多打开的连接,而苹果的服务器出于任何原因关闭了这些连接。
试着看看这些问题是否在连接数量减少的情况下依然存在。没有解决方案,但我认为是苹果公司关闭了连接,以便在不再发送数据时重新使用套接字
为了避免错误,我现在使用增强通知。我认为这不是一个限制,因为苹果通知服务管理很多通知。即使其他线程发送相同数量的通知,这种情况也不会发生在每个线程上。好吧,如果不是这样,那是因为其他原因。不管是什么原因,APNS决定不再和你说话了。APNS正在关闭连接,而您的程序在尝试使用不再打开的连接时遇到异常。如果线程引发异常,则写入操作未完成,不是吗?当然,传递到写入操作的数据尚未传递。在以前的写入操作中发送的数据也可能尚未交付。我们不能确定,因为我们不知道APN何时发送重置,也不知道在发送重置之前它选择读取多少数据(如果有)。因此,没有办法知道字节是如何发送的。谢谢,但我已经阅读了这篇文章。他的问题通过使用更高的超时时间得到解决。我已经编写了自己的实现来发送大量通知(每条消息500k)。所以我打开了16个连接(ax20)。错误的设备令牌在发送之前被删除,并且令牌在反馈服务中被禁用。但是我在发送之后不读取响应,而是在写入之后关闭连接。我使用threadpool,并且在每个线程中声明一个ssl流,所以我认为套接字是不共享的。Apple允许20个连接。因此,为了避免太多的连接问题,我将它们的数量限制为16个。有一种方法可以知道同时打开了多少个连接?