WSARecv参数lpNumberOfBytesRecvd的一个变态问题

这个函数干嘛的我就不多说了,搞winsock编程的都认识它!
我在使用这个函数时,按照MSDN上的描述,将lpNumberOfBytesRecvd设定成了NULL,因为咱是IOCP嘛,照MSDN的说法,如果LPWSAOVERLAPPED不为NULL,那么这个参数可以设定为NULL。
我 也就这样使用了,程序跑起来,测试也正常,但是有些情况下不稳定,我这可是服务器啊,任何问题都必须被消灭,于是开始Debug服务器,经过一天的折腾之 后我发现在WSARecv之后有时会有一个异常输出,意思就是访问了非法内存,但是被C++库截获并解决掉了,奇怪怎么会有这个问题?

再反复琢磨了WSARecv的参数之后,我决定给lpNumberOfBytesRecvd设置一个有效的地址试试,当然这样考虑的原因就是BT的 问题一定要BT的解决。结果一运行再也不输出任何关于访问非法内存的异常,再仔细跟踪发现lpNumberOfBytesRecvd这个参数有些情况下会 同步的返回接收的字节数,虽然在IOCP模型中这可能已经没有意义了,因此我猜测在WSARecv函数的实现中,总是会写这个值在 lpNumberOfBytesRecvd中,而不管这个地址是否有效,由此推测微软的程序员也是会偷懒的,不检查参数,而是像java程序员一样依赖异 常处理来搞定问题。但是对于服务器来说异常过多就意味着效率的极端低下,以及潜在的不稳定。因此要想办法消灭每一个异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
易语言中的wsarecv一个网络编程函数,用于从指定的套接字接收数据。下面是对wsarecv的详细解释: wsarecv函数的语法: wsarecv(nsocket, lpbuf, dwbufsize, lpnum, lpflags, lpoverlapped, lpcallback) 参数说明: - nsocket:指定的套接字句柄。 - lpbuf:指向一个缓冲区,用于接收数据。 - dwbufsize:缓冲区的大小。 - lpnum:指向一个变量,返回实际接收到的字节数。 - lpflags:指向一个变量,指定接收操作的附加标志。 - lpoverlapped:指向一个OVERLAPPED结构的指针,用于指定异步操作。 - lpcallback:指向一个回调函数,用于处理异步操作的完成。 wsarecv函数的功能: wsarecv函数使用指定的套接字接收数据,并将接收的数据存储到指定的缓冲区中。通过该函数,程序可以从网络中接收数据,实现网络通信功能。 wsarecv函数的返回值: - 若函数调用成功,则返回0,表示接收数据成功。 - 若函数调用失败,则返回一个错误代码,表示接收数据失败。 注意事项: - 调用wsarecv函数前,需要先创建套接字、连接服务器,并进行相应的配置。 - wsarecv函数属于同步函数,即在接收数据完成之前,会一直等待数据的到达。如果需要实现异步操作,应使用指定的OVERLAPPED结构和回调函数。 总结: wsarecv是易语言中用于接收数据的网络编程函数。通过调用该函数,程序可以从指定的套接字接收数据,并将接收到的数据存储到指定的缓冲区中。此函数在网络通信中起到了重要的作用,使程序能够实现网络数据的接收功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值