Newlife.Net QA
?
?
?
Q1:當數據包很大時,客戶端可以成功發送大的數據包,為什么服務端收到的數據包卻被限制為緩沖區的大小64K?
A1:
這里傳入的參數SocketAsyncEventArgs實例即e的緩沖區大小為64K,并不是客戶端發送的600K,這個緩沖區的大小是由se決定的? 經驗證(增大se的緩沖區大小,使它大于發送的數據包大小,則數據包可以正確接收),上述推斷正確。
Q2: 有新會話的處理,NewSession的回調問題,NewSession的回調函數被綁定為Server_NewSession,不是會遞歸調用這個函數,造成死循環?
A2 :這里需要注意的是,雖然Server_NewSession是在NetServer中定義的,NetServer的NewSession委托卻并沒有被指定為Server_NewSession.例如,對于TCP通信,啟動TCPServer進行監聽初始化時,會對TCPServer的NewSession綁定,TCPServer繼承自ISocektServer,所以TCPSerever的NeSession被綁定為Server_NewSession,而NetServer中的NewSession默認為null,不會造成遞歸調用,從而形成死循環。
?
梳理一下自定義服務器的實現流程:
?自定義服務器:NetServer<自定義服務器對應的Session> ,通過調用NetServer.Start()函數啟動,進一步調用NetServer.OnStart()方法,在此方法中根據協議類型創建了TCP,UDP,IPv4,IPv6的服務器實例(如TCPServer),對服務器實例綁定NewSession事件。對于TCPServer,當收到Accept請求時,創建Session,并觸發NewSession,執行上面的函數;對于UPDServer,會直接觸發receive。
? ? ? 處理accept 或者receive是又服務器實例類型決定的,TCPServer和UDPServer的Start函數內容不同。
?
Q3:?
?
? ? ? ?這個事件是在哪里定義的回調函數?具體回調流程處理又是怎樣?
A2:
? ? ? 有兩個地方定義了Received事件,一個是服務器的,一個是會話的,注意區分。
? ? ?1.服務器(NetServer繼承自IServer)
?
? 2.會話(INetSession)
?
這個事件回調函數的定義在有新的會話進入時(對TCP是有新的連接,對UDP是收到新的數據包)
可以看到,回調函數被定義為OnReceived,這里是處理的Session的Received。同上,并沒有對NetServer定義的Received進行綁定,所以這里的Received為null
這里提供了一個鉤子,最后的OnReceive對會話和packet處理可以在自定義服務器中進行處理 。
雖然進行了復雜的綁定,但在TCP通信時,收包事件觸發后并沒有通過觸發OnReceived調用OnReceive,而是直接調用的OnReceive函數
?
轉載于:https://www.cnblogs.com/mbaymax/p/11357614.html
總結
以上是生活随笔為你收集整理的Newlife.Net QA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV计算机视觉实战(Python
- 下一篇: asp.net ajax控件工具集 Au