GetAcceptExSockaddrs [1] 是专门为AcceptEx函数准备的应用。
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的值,就会出错。
暂无评论内容