使用完成端口的时候,怎么取得对方的地址?

EnigmaXJ 2004-03-10 09:32:09
我遇到的问题如下:
1:
BOOL CNetProcessCompletionPort::PostOneAcceptEx()
{
SOCKET AcceptSocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP, \
NULL, 0, WSA_FLAG_OVERLAPPED);
if (INVALID_SOCKET == AcceptSocket)
return FALSE;
PPER_IO_CONTEXT lpAcceptExIoContext = (PPER_IO_CONTEXT)MyAlloc(1,OVERLAPPED_PLUS_HEAD_SIZE + BUFFER_SIZE ) ;
if(lpAcceptExIoContext == NULL)
return FALSE ;
ZeroMemory(&(lpAcceptExIoContext->ol), sizeof(lpAcceptExIoContext->ol));
lpAcceptExIoContext->sClient = AcceptSocket;
lpAcceptExIoContext->IoOperation = IoAccept;
ZeroMemory(lpAcceptExIoContext + 1 , BUFFER_SIZE) ;
lpAcceptExIoContext->wsaBuffer.buf = (char*)(lpAcceptExIoContext + 1 );
lpAcceptExIoContext->wsaBuffer.len = BUFFER_SIZE - ((sizeof(SOCKADDR_IN) + 16)*2);

DWORD dwBytes;
BOOL bSuccess = lpAcceptEx(
m_ListenSocket,
lpAcceptExIoContext->sClient,
lpAcceptExIoContext->wsaBuffer.buf,
lpAcceptExIoContext->wsaBuffer.len,
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&dwBytes,
&(lpAcceptExIoContext->ol));

if (FALSE == bSuccess)
{
int nResult = WSAGetLastError();
if (nResult != ERROR_IO_PENDING)
{
return FALSE;
}
}
return TRUE ;
}
2:在工作线程里面,我在接收连接之后调用GetAcceptExSockaddrs函数,它将我的所有参数都设置成0。换用getpeername函数之后,返回错误代码10057(是说对等方没有连接)。但是我已经收到连接通知了啊???!
3:我在工作线程又调用了GetQueuedCompletionStatus之后,在其它线程对已经连接的端口调用getpeername这此没有返回错误,但是仍然给我空地址,也就是把我的sockaddr_in结构设置为全0!这是否是因为我在本机对自己连接的原因呢?为了方便调试,我在自己机器上发起的连接请求。
大家救我!!!!!!!!!!!!!!!!!!!!!!!!!!!!
...全文
89 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
EnigmaXJ 2004-07-12
  • 打赏
  • 举报
回复
现在我还没有解决掉这个问题,因为别的项目放了这么久了……

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧