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

相關問題