最近改进IOCP引擎的时候遇到的一个郁闷的问题,WSASend总是返回WSAEFAULT,而且检查调用方式都很正常,我一次发送多个数据包,所以LPWSABUF数目>=1,
我们先来看看微软官方的说明:
The lpBuffers, lpNumberOfBytesSent, lpOverlapped, lpCompletionRoutine parameter is not totally contained in a valid part of the user address space.
意思是参数涉及的内存空间在用户层并不完全有效,
尝试了好几次最后才突然想到Win32 API大多函数需要双字节对齐,当然64位估计是双字对齐,用内存池的就要特别注意了,
所以LPWSABUF指向的内存地址一定要对齐已经发送数据地址开始也需要对齐.
由此想到很多其他API需要对器,包括我们常用的MessageBox某些情况下也要对齐堆栈,至少Vista 64是这样