关于GetAcceptExSockaddrs函数参数的设置注意事项

GetAcceptExSockaddrs [1] 是专门为AcceptEx函数准备的应用。

null

void GetAcceptExSockaddrs(

_In_ PVOID lpOutputBuffer,

_In_ DWORD dwReceiveDataLength,

_In_ DWORD dwLocalAddressLength,

_In_ DWORD dwRemoteAddressLength,

_Out_ LPSOCKADDR *LocalSockaddr,

_Out_ LPINT LocalSockaddrLength,

_Out_ LPSOCKADDR *RemoteSockaddr,

_Out_ LPINT RemoteSockaddrLength );

lpOutputBuffer [in]

指向传递给AcceptEx函数接收客户第一块数据的缓冲区

dwReceiveDataLength [in]

lpoutputBuffer缓冲区的大小,必须和传递给AccpetEx函数的一致

dwLocalAddressLength [in]

为本地地址预留的空间大小,必须和传递给AccpetEx函数一致

dwRemoteAddressLength [in]

为远程地址预留的空间大小,必须和传递给AccpetEx函数一致

LocalSockaddr [out]

用来返回连接的本地地址

LocalSockaddrLength [out]

用来返回本地地址的长度

RemoteSockaddr [out]

用来返回远程地址

RemoteSockaddrLength [out]

用来返回远程地址的长度

返回值: 这函数没有返回值。

当使用AccpetEx函数需要接收客户端第一组发来的数据时,参数dwReceiveDataLength为缓冲区的大小,注意,不是实际接收到的数据的大小,是缓冲区的大小。

当不需要接收第一组发来的数据时,AcceptEx函数和GetAcceptExSockaddrs函数都把dwReceiveDataLength设定为0即可

之前,我因为参数设置问题而犯的错误是这样的:

GetQueuedCompletionStatus会返回实际传输的字节数,我用该字节数去更新了重叠IO中的WSABUF变量的len变量值,然后在后续处理中,需要获取缓冲区数据时,直接用WSABUF的len作为读取的终止标识;这样,在recv时,没有问题,但在
GetAcceptExSockaddrs获取客户端信息时,对参数dwReceiveDataLength传入
WSABUF的len的值,就会出错。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容