使用完成端口模型时遇到的坑(学习记录1)

使用完成端口模型时遇到的坑(学习记录1)

1、完成端口模型的使用中遇到GetQueuedCompletionStatus中的输出参数:“完成键”(lpCompletionKey)返回的地址不能正确指向目标数据。

代码如下:

//INFINITE:无限制等待
		if (0 == GetQueuedCompletionStatus(CompletionPort, &BytesTransferred, (PULONG_PTR)&PerHandleData, (LPOVERLAPPED *)&PerIoData, INFINITE))
		{
			cout << "GetQueuedCompletionStatus failed with error " << GetLastError() << endl;
			return 0;
		}

解决法案:将x64的调试或运行环境改成x86,(原理:64位的环境下的变量的关键字与32位环境的会有差别。具体差别请自行参考资料)64位的环境会导致输出参数的地址截断,从而使得完成键的地址错误。

2、主线程使用了WSARecv后,在子线程中再次调用从而导致了获取异常

小白做法:仅主线程调用WSARecv,子线程负责对数据处理即可。

3、使用过程中因为传参的需要,容易发生数据的存取访问权限冲突。

.error1:内存越界。本人认为越界情况分为两种:一种是指向的地址完全跟目标没有任何关系(即指针error),另一种就是小访大(即指针是对的,但是指针偏移的大小超过了其类型大小)

. error2:内存泄漏,该释放的空间未释放。

. error3:使用的函数有误。比如strcpy和strcpy_s就是这样,看代码:

char szBuf[2] = {0};

 strcpy_s(szBuf, 2, "12131");  //新的CRT函数
 strcpy(szBuf,  "12131");    //老的CRT函数

有明显有缓冲区溢出的问题。 使用strcpy_s函数则会抛出一个异常。而使用strcpy函数的结果则未定,因为它错误地改变了程序中其他部分的内存的数据,可能不会抛出异常但导致程序数据错误,也可能由于非法内存访问抛出异常。

未完待续…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值