Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ';远程主机';当发送大量数据时_C#_Multithreading_Threadpool_Apple Push Notifications_Socketexception - Fatal编程技术网

C# ';远程主机';当发送大量数据时

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

我在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 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个。有一种方法可以知道同时打开了多少个连接?