WSARecv参数lpNumberOfBytesRecvd的一个变态问题
這個函數干嘛的我就不多說了,搞winsock編程的都認識它!
我在使用這個函數時,按照MSDN上的描述,將lpNumberOfBytesRecvd設定成了NULL,因為咱是IOCP嘛,照MSDN的說法,如果LPWSAOVERLAPPED不為NULL,那么這個參數可以設定為NULL。
我也就這樣使用了,程序跑起來,測試也正常,但是有些情況下不穩定,我這可是服務器啊,任何問題都必須被消滅,于是開始Debug服務器,經過一天的折騰之后我發現在WSARecv之后有時會有一個異常輸出,意思就是訪問了非法內存,但是被C++庫截獲并解決掉了,奇怪怎么會有這個問題?
再反復琢磨了WSARecv的參數之后,我決定給lpNumberOfBytesRecvd設置一個有效的地址試試,當然這樣考慮的原因就是BT的問題一定要BT的解決。結果一運行再也不輸出任何關于訪問非法內存的異常,再仔細跟蹤發現lpNumberOfBytesRecvd這個參數有些情況下會同步的返回接收的字節數,雖然在IOCP模型中這可能已經沒有意義了,因此我猜測在WSARecv函數的實現中,總是會寫這個值在lpNumberOfBytesRecvd中,而不管這個地址是否有效,由此推測微軟的程序員也是會偷懶的,不檢查參數,而是像java程序員一樣依賴異常處理來搞定問題。但是對于服務器來說異常過多就意味著效率的極端低下,以及潛在的不穩定。因此要想辦法消滅每一個異常。
總結
以上是生活随笔為你收集整理的WSARecv参数lpNumberOfBytesRecvd的一个变态问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VTK修炼之道6_仔细分析一个复杂程序
- 下一篇: PIC单片机精通_ADC左对齐与右对齐的