1. 程式人生 > >IM軟體業務知識—iOS 客戶端建立網路連線,常見錯誤彙總

IM軟體業務知識—iOS 客戶端建立網路連線,常見錯誤彙總

----------------------------------------------------歡迎檢視IM軟體業務知識《專欄》-------------------------------------------------------------------
使用狀態機來保持線上狀態 【點選】                      拼圖演算法,將零碎小圖,整理到一張大圖上【點選
登入導航 【點選】                                                   會話session的概念【點選】       
“假線上’ 【點選】                                                    非對稱加密,RSA演算法【

點選
如何建立安全socket連線、登入 【點選】               淺談斷線重連、心跳和長線上 【點選
iOS 客戶端建立網路連線,常見錯誤彙總 【點選】 protocolBuf 在iOS上的使用入門、講解、指南 【點選
實現富文字解析【點選】                                          UITableview Deceleration 加速滑動(慣性滑動)、彈性迴歸原理【點選
--------------------------------------------------------------------------------------------------------------------------------------------------------------------

在做iOS 客戶端 Server-Client專案的時候,需要Client登入和長連線。所以,網路和socket的問題,變得重要起來。

在網上查閱找一些資料,供網友參考,下面是遇到的一些錯誤碼:

     * Domain=NSPOSIXErrorDomain Code = 51 "Network is unreachable"
     * Domain=NSPOSIXErrorDomain Code = 54 "Connection reset by peer" 連線復位 "在連線斷開後的讀和寫操作引起的"
     * Domain=NSPOSIXErrorDomain Code = 57 "Socket is not connected"
     * Domain=NSPOSIXErrorDomain Code = 60 "Operation timed out"
     * Domain=NSPOSIXErrorDomain Code = 61 "Connection refused"
     * Domain=NSPOSIXErrorDomain Code = 65 "No route to host"

     * 更多的錯誤碼在 #include <sys/errno.h>裡

Domain=NSPOSIXErrorDomain Code = 65 "No route to host"

網上

以上摘自:http://stackoverflow.com/questions/3635412/intermittent-no-route-to-host-on-ios-flight-mode-off-then-on-fixes

Domain=NSPOSIXErrorDomain Code = 57 "Socket is not connected"

通常是網路立即斷開,比如切換為“飛航模式”,立即得到一個Socket is not connected。

Domain=NSPOSIXErrorDomain Code = 60 "Operation timed out"

【問題】更新Cydia的時候出錯,提示POSIX:Operation timed out?!!!怎麼解決 啊??【解決】:
● 連線超時,用vpn或者換個時間再更新就可以了
● 返回一次,重新進入就行,不必象LS說的那麼麻煩!我就是這麼搞定的
● 有道理!我就是把這個源刪掉,其他就全部正常了的!是cydia.sellize.com。樓主可以試試。
● 如果你的威鋒源還是舊地址你換成新地址,我的是這麼解決的。
● 這兩天人多,伺服器受不了。連線超時,多等等就好了
● 網路問題!我的聯通3g也是這樣,不過用wifi就好了

Domain=NSPOSIXErrorDomain Code = 61 "Connection refused"

看到書上的程式碼中一般建立一個socket連線,進行一次send、recv,然後close(socket)。現在在一次連線中進行了兩次send、recv,然後就發現在進行大概二三十次的重複過程後,就會出現connect failed,connection refused的提示,網上查資料時說出現connection refused一般是因為伺服器的埠沒有開啟,可是埠是開著呀,不知道怎麼回事了!是不是因為在一次連線中進行了兩次收發資料的原因呢?因為在之前進行一次收發資料的時候是很穩定的,盼cu的高手來指點一下。
如果是客戶端去連線對應服務端的埠,肯定需要服務端的埠開著的。我估計你的服務端也是自己寫的。
1、可能是客戶端連線後沒有close,次數一多,服務端沒資源提供服務而連線不上,你的情況close了,而且20~30次不會是這種問題。
2、服務端沒開,你所說的埠是開著的我不是很相信,我覺得更多的可能是你的服務端不健壯,你用客戶端send了幾次後把服務端的程式給搞死了。
3、第三種可能就是網路問題,我覺得可能性不大。


綜上,我認為是2情況導致,你下次模擬重現的時候,如果再發生你說的情況,請到你開服務端的程式看看,看是不是被搞死了。

Domain=NSPOSIXErrorDomain Code = 51 "Network is unreachable"

當前裝置沒有網路,然後執行連線操作,就會有報51的錯誤。

Domain=NSPOSIXErrorDomain Code = 54 "Connection reset by peer"

找遍了中英文的一些網站,搜遍了能找的每個角落,發現了出現這種狀況的原理,該異常在客戶端和伺服器端都有可能發生,引起該異常的原因有兩個: 
1,如果一端的Socket被關閉(或主動關閉,或因為異常退出而 引起的關閉),另一端仍傳送資料,傳送的第一個資料包引發該異常(Connect reset by peer)。 
2,一端退出,但退出時並未關閉該連線,另一端如果在從連線中讀資料則丟擲該異常(Connection reset)。 
簡單的說就是在連線斷開後的讀和寫操作引起的。
TCP機制中,socket連線的雙方都可以呼叫close()之類的函式退出當前連線,TCP根據改進了的三次握手機制通知另一方也退出當前連線。這個過程可以看做是正常socket連線的一部分。同時,TCP提供一種復位機制,在一方的程式遇到異常情況斷開此次連線後,會向對方傳送重置報文。復位是即時的退出,並清理此次連線相關的所有資源。
所以出現Connection reset by peer的原因是對端伺服器異常退出了此次連線。
客戶端遇到這種情況,只有重新和伺服器端建立連線。我遇到的這種情況下,有時要重試5次左右才能夠正常連線上。
上面一段摘自:http://blog.csdn.net/shaovey/article/details/4678717