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