2011年7月10日

CFWriteStreamOpen連線建很久

把前陣子遇到的問題筆記一下 :
前陣子嘗試著要做iOS裝置間訊息的傳遞

一開始找到了這個聊天室的範例:

http://mobileorchard.com/tutorial-networking-and-bonjour-on-iphone/
用Bonjour network發佈服務,傳輸部份則用CFStream來完成

run範例後跑起來有個問題:選擇了聊天室後,連線卻要等1分鐘左右才會建立
設了一些NSLog都跑完了,也可以打字,不過傳輸的文字還是傳不過去

但一分鐘後連線建立,聊天訊息傳遞得很順暢且很即時



後來看官方文件CFNetwork Programming Guide
在Working with Streams的Preventing Blocking When Working with Streams一段裡面
才知道問題:

CFWriteStreamOpen(myWriteStream)是一件耗時的process

為了避免block,雖然會馬上傳送TRUE,但實際myWriteStream卻還在建立

後來用CFReadStreamGetStatus+while迴圈去看狀態

會一直都是kCFStreamStatusOpening,一分鐘後stream建立,狀態才會變成開啟完成

開啟完成後,指定的callback才會被啟動,連線才建立起來

最後改用NSStream解決,連線馬上就建立了


但還是不懂為什麼CFStream建個連線要這麼久...

範例中CFWriteStreamOpen的一些code可參考:
client(RemoteRoom)建立連線後

server(LocalRoom)過了1分鐘左右才會啟動callback函式

server.m的serverAcceptCallback

connect.m的writeStreamHandleEvent和readStreamHandleEvent

沒有留言: