AcceptEx返回FALSE而WSAGetLastError却返回0,叫我情何以堪!

dzz10 2012-10-10 07:15:37
代码如下:

BOOL CServer::PostAccept(CHandleData* pHandleData, CIoData *pIoData)
{
pIoData->OperationType = IO_TYPE_ACCEPT;
DWORD dwBytesRecv = 0;
pHandleData->accSock = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
BOOL b = AcceptEx(m_ListenSock, pHandleData->accSock, pIoData->szBuff, 0/*表示尽快建立连接,不等待数据*/,
sizeof(sockaddr)+16, sizeof(sockaddr)+16, &dwBytesRecv, (LPOVERLAPPED)&pIoData);

if(!b){
int err = WSAGetLastError();
if(err != WSA_IO_PENDING){
SetErrorString(_T("IO_TYPE_ACCEPT出错!"));
return FALSE;
}
}

pHandleData->pIOData = pIoData;
return TRUE;
}
...全文
300 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dzz10 2012-10-16
  • 打赏
  • 举报
回复
结贴!
xuggzu 2012-10-11
  • 打赏
  • 举报
回复
pHandleData->accSock = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
这里改成:
pHandleData->accSock = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);
试试吧。。。
Eleven 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
to VisualEleven
据我理解,在有acceptex函数的情况下,不需要调用WSAIoctl函数来动态获取acceptex函数。
而且当我把代码改成:

C/C++ code



BOOL CServer::PostAccept(CHandleData* pHandleData, CIoData *pIoData)
{
pIoData->OperationT……
[/Quote]
我没有直接使用过AcceptEx函数,使用WSAIoCtl导出的,你可以试试WSAIoCtl导出该函数指针,然后调用试试
dzz10 2012-10-11
  • 打赏
  • 举报
回复
看来此贴已经尸沉大海了。
dzz10 2012-10-10
  • 打赏
  • 举报
回复
to VisualEleven
据我理解,在有acceptex函数的情况下,不需要调用WSAIoctl函数来动态获取acceptex函数。
而且当我把代码改成:


BOOL CServer::PostAccept(CHandleData* pHandleData, CIoData *pIoData)
{
pIoData->OperationType = IO_TYPE_ACCEPT;
DWORD dwBytesRecv = 0;
pHandleData->accSock = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
BOOL b = AcceptEx(m_ListenSock, pHandleData->accSock, pIoData->szBuff, 0/*表示尽快建立连接,不等待数据*/,
sizeof(sockaddr)+16, sizeof(sockaddr)+16, &dwBytesRecv, (LPOVERLAPPED)&pIoData);

if(!b){
int err = WSAGetLastError();
if(err && err != WSA_IO_PENDING){
SetErrorString(_T("IO_TYPE_ACCEPT出错!"));
return FALSE;
}
}

pHandleData->pIOData = pIoData;
return TRUE;
}



这样服务器是能够正常运行的。
我就是感觉很奇怪,为什么AcceptEx返回FALSE而WSAGetLastError却返回0,难道这是微软没注意到的地方?
dzz10 2012-10-10
  • 打赏
  • 举报
回复
to VisualEleven
据我理解,在有acceptex函数的情况下,不需要调用WSAIoctl函数来动态获取acceptex函数。
而且当我把代码改成:

BOOL CServer::PostAccept(CHandleData* pHandleData, CIoData *pIoData)
{
pIoData->OperationType = IO_TYPE_ACCEPT;
DWORD dwBytesRecv = 0;
pHandleData->accSock = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
BOOL b = AcceptEx(m_ListenSock, pHandleData->accSock, pIoData->szBuff, 0/*表示尽快建立连接,不等待数据*/,
sizeof(sockaddr)+16, sizeof(sockaddr)+16, &dwBytesRecv, (LPOVERLAPPED)&pIoData);

if(!b){
int err = WSAGetLastError();
if(err != WSA_IO_PENDING){
SetErrorString(_T("IO_TYPE_ACCEPT出错!"));
return FALSE;
}
}

pHandleData->pIOData = pIoData;
return TRUE;
}


这样服务器是能够正常运行的。
我就是感觉很奇怪,为什么AcceptEx返回FALSE而WSAGetLastError却返回0,难道这是微软没注意到的地方?
Eleven 2012-10-10
  • 打赏
  • 举报
回复
http://blog.csdn.net/visualeleven/article/details/6088590
这里有个使用的例子代码~
Eleven 2012-10-10
  • 打赏
  • 举报
回复
Note: The function pointer for the AcceptEx function must be obtained at run time by making a call to the WSAIoctl function with the SIO_GET_EXTENSION_FUNCTION_POINTER opcode specified. The input buffer passed to the WSAIoctl function must contain WSAID_ACCEPTEX, a globally unique identifier (GUID) whose value identifies the AcceptEx extension function. On success, the output returned by the WSAIoctl function contains a pointer to the AcceptEx function. The WSAID_ACCEPTEX GUID is defined in the Mswsock.h header file.

dzz10 2012-10-10
  • 打赏
  • 举报
回复
坐等高手
dzz10 2012-10-10
  • 打赏
  • 举报
回复
就是啊,false表示失败,而0则表示成功,纠结。。。
Gloveing 2012-10-10
  • 打赏
  • 举报
回复
Code Description Name
0 The operation completed successfully. ERROR_SUCCESS
大熊猫侯佩 2012-10-10
  • 打赏
  • 举报
回复
前者false表示失败,后者0一定表示成功吗?

我没看这个api的文档,但应该有说明吧?
dzz10 2012-10-10
  • 打赏
  • 举报
回复
不能沉啊 亲

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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