3

我在C#多线程窗口服务中发送推送通知时遇到了一些麻烦。
当我有很多的通知发送到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个线程的线程池,每个线程打开一个联接苹果。
这不是一个超时,因为我有尝试:sslStream.WriteTimeout = 60000;
我也曾尝试用:Client.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.KeepAlive, false);

的连接不是在发送的开始关闭。

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

您是否了解此异常的来源? 如何解决它?

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

非常感谢您的回答!

回答

0

没有解决方案,但我认为苹果公司在没有更多数据发送时关闭连接以重新使用套接字。

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

4

例外情况“现有连接被远程主机强行关闭”通常意味着您打开连接的另一主机决定不再与您通话。要做到这一点,它会发送一个带RST的FIN来关闭连接。

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

+0

我认为,这是因为苹果通知服务管理大量通知的不是节流。而且这不会发生在每个线程上,即使其他线程发送相同数量的通知。 – malinois 2011-03-16 20:52:06

+1

好吧,如果它不起作用,这是其他原因。无论出于何种原因,APNS正在决定它不想再跟你说话。 APNS正在关闭连接,并且您的程序在尝试使用不再打开的连接时收到异常。 – 2011-03-16 21:05:53

+0

如果线程抛出异常,写入操作没有完成,不是吗? – malinois 2011-03-16 21:47:12

1

从APNS夏普我已经看到用户所看到的这个错误时,他们在恶劣的设备令牌已经过了 - http://code.google.com/p/apns-sharp/issues/detail?id=35

如果这不是问题的答案,那么你能确认你的代码不能正常工作当你打开较少的线程?或者当您发送更少数量的数据时它工作吗?

作为一个旁白,是否真的有必要同时打开16个连接?这似乎相当高。

+0

谢谢,但我已经阅读了这篇文章。他的问题是通过使用更高的超时来解决的。我写了自己的实现来发送大量通知(每条消息500k)。所以我打开16个连接(ax 20)。在发送之前删除坏的设备令牌,并通过反馈服务禁用令牌。 – malinois 2011-03-20 12:39:06

1

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

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

+0

但是在发送之后我没有读到响应,我在'write'后面关闭了连接。我使用线程池,并且我在每个线程中声明了一个ssl流,所以我认为套接字不共享。 – malinois 2011-03-21 14:57:35

1

可能是你有太多的开放连接和苹果公司的服务器,无论出于何种原因关闭它们。 尝试查看问题是否以较少的连接持续存在。

+0

Apple允许20个连接。所以为了防止太多的连接问题,我限制了它们的数量。有一种方法可以知道同时打开了多少个连接? – malinois 2011-03-22 20:36:51

相关问题