WSARecv参数lpNumberOfBytesRecvd的一个变态问题
2017-10-10 14:17
267 查看
这个函数干嘛的我就不多说了,搞winsock编程的都认识它!
我在使用这个函数时,按照MSDN上的描述,将lpNumberOfBytesRecvd设定成了NULL,因为咱是IOCP嘛,照MSDN的说法,如果LPWSAOVERLAPPED不为NULL,那么这个参数可以设定为NULL。
我也就这样使用了,程序跑起来,测试也正常,但是有些情况下不稳定,我这可是服务器啊,任何问题都必须被消灭,于是开始Debug服务器,经过一天的折腾之后我发现在WSARecv之后有时会有一个异常输出,意思就是访问了非法内存,但是被C++库截获并解决掉了,奇怪怎么会有这个问题?
再反复琢磨了WSARecv的参数之后,我决定给lpNumberOfBytesRecvd设置一个有效的地址试试,当然这样考虑的原因就是BT的问题一定要BT的解决。结果一运行再也不输出任何关于访问非法内存的异常,再仔细跟踪发现lpNumberOfBytesRecvd这个参数有些情况下会同步的返回接收的字节数,虽然在IOCP模型中这可能已经没有意义了,因此我猜测在WSARecv函数的实现中,总是会写这个值在lpNumberOfBytesRecvd中,而不管这个地址是否有效,由此推测微软的程序员也是会偷懒的,不检查参数,而是像java程序员一样依赖异常处理来搞定问题。但是对于服务器来说异常过多就意味着效率的极端低下,以及潜在的不稳定。因此要想办法消灭每一个异常。
我在使用这个函数时,按照MSDN上的描述,将lpNumberOfBytesRecvd设定成了NULL,因为咱是IOCP嘛,照MSDN的说法,如果LPWSAOVERLAPPED不为NULL,那么这个参数可以设定为NULL。
我也就这样使用了,程序跑起来,测试也正常,但是有些情况下不稳定,我这可是服务器啊,任何问题都必须被消灭,于是开始Debug服务器,经过一天的折腾之后我发现在WSARecv之后有时会有一个异常输出,意思就是访问了非法内存,但是被C++库截获并解决掉了,奇怪怎么会有这个问题?
再反复琢磨了WSARecv的参数之后,我决定给lpNumberOfBytesRecvd设置一个有效的地址试试,当然这样考虑的原因就是BT的问题一定要BT的解决。结果一运行再也不输出任何关于访问非法内存的异常,再仔细跟踪发现lpNumberOfBytesRecvd这个参数有些情况下会同步的返回接收的字节数,虽然在IOCP模型中这可能已经没有意义了,因此我猜测在WSARecv函数的实现中,总是会写这个值在lpNumberOfBytesRecvd中,而不管这个地址是否有效,由此推测微软的程序员也是会偷懒的,不检查参数,而是像java程序员一样依赖异常处理来搞定问题。但是对于服务器来说异常过多就意味着效率的极端低下,以及潜在的不稳定。因此要想办法消灭每一个异常。
相关文章推荐
- 正规表达式 在查找替换中的使用 一个看类似变态问题的解决
- 时间模糊查询一个很变态的问题!
- 搞定最为变态的一个Ubuntu下的问题---- 双系统环境下 Ubuntu只能访问百度、谷歌网站!
- 一个变态问题的解决!!!!!!!!!(时间)
- ie6的又一个变态问题
- 用 Python 的 Descriptor 特性解决一个变态的问题
- 用 Python 的 Descriptor 特性解决一个变态的问题
- WSARecv参数lpNumberOfBytesRecvd的一个变态问题
- 用一个变态的方法解决winform闪烁问题
- 用 Python 的 Descriptor 特性解决一个变态的问题
- 用 Python 的 Descriptor 特性解决一个变态的问题
- ACCESS模糊查询出现的变态问题,不知道该问题的希望注意,知道内幕的高手还望给小弟一个解释 Thanks
- WSARecv参数lpNumberOfBytesRecvd的一个变态问题
- 今天遇到的一个比较变态的问题
- ie6的又一个变态问题
- 解决linux下写一个文件之后立马读,读出乱码或者空白的问题
- 不经意间用了ibatis的缓存引发的一个问题
- 一个sql的问题
- 20、线程同步的一个小问题
- 父类子类之间的一个经典题目(有关成员变量何时赋值和在哪里赋值的问题)