VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 513|回复: 0

[求助] VC 重新仔细描述10038

[复制链接]
50_avatar_middle
在线会员 wxliang 发表于 2018-8-24 15:42:45 | 显示全部楼层 |阅读模式
3驿站币
本帖最后由 wxliang 于 2018-8-24 16:22 编辑
  1. BOOL CIOCPTCP::WinSockInit()
  2. {
  3.         WSADATA data = {0};
  4.         if(WSAStartup(MAKEWORD(2, 2), &data))
  5.                 return FALSE;
  6.         if ( LOBYTE(data.wVersion) !=2 || HIBYTE(data.wVersion) != 2 )
  7.         {
  8.                 WSACleanup();
  9.                 return FALSE;
  10.         }
  11.         return TRUE;
  12. }
复制代码

  1. BOOL CIOCPTCP::Start()
  2. {
  3.         WinSockInit();
  4.         .........................................................
  5.         HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, WorkerThreadProc, (LPVOID)this, 0, nullptr);
  6.         .........................................................
  7.         return TRUE;
  8. }
复制代码

  1. UINT CIOCPTCP::WorkerThreadProc(LPVOID pv)
  2. {
  3.         CIOCPTCP* pServer = (CIOCPTCP*)pv;
  4.         ...................
  5.        // DoAccept();
  6.         while(TRUE)
  7.         {
  8.                 dwErrorCode = NO_ERROR;
  9.                 dwBytes=0;
  10.                 pUserSocket=NULL;
  11.                 pOverlapped=NULL;
  12.                 BOOL result = ::GetQueuedCompletionStatus
  13.                                                                                                 (
  14.                                                                                                         pServer->m_hCompletionPort,
  15.                                                                                                         &dwBytes,
  16.                                                                                                         (PULONG_PTR)&pUserSocket,
  17.                                                                                                         &pOverlapped,
  18.                                                                                                         INFINITE
  19.                                                                                                 );
  20.                pServer->CheckIocpCommand(pv,pOverlapped,dwBytes,(ULONG_PTR)pUserSocket);
  21.         ...............................
  22.         return 0;
  23. }
复制代码

  1. EnIocpAction CIOCPTCP::CheckIocpCommand(LPVOID pv,OVERLAPPED* pOverlapped, DWORD dwBytes, ULONG_PTR ulCompKey)
  2. {
  3.         //DoAccept();
  4.         CIOCPTCP* pServer = (CIOCPTCP*)pv;
  5.         EnIocpAction action = IOCP_ACT_CONTINUE;
  6.         switch(dwBytes)
  7.         {
  8.                 case IOCP_CMD_ACCEPT        : pServer->DoAccept()                                ; break;
  9.         }
  10.         return action;
  11. }
复制代码

  1. BOOL CIOCPTCP::DoAccept()
  2. {
  3.         int iBufLen = 0;
  4.         DWORD dwNo = 0;
  5.         BOOL bDontLinger = FALSE;
  6.         int result=0;
  7.         SOCKET cClientSKT=INVALID_SOCKET;
  8.         WinSockInit();
  9.         cClientSKT=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);
  10.         if (INVALID_SOCKET == cClientSKT)
  11.         {
  12.         }
  13.         else
  14.         {
  15.         .............................................................
  16.                 if(!m_pfnAcceptEx(m_ListenSocket,cClientSKT,
  17.                         cbuffobj->data,
  18.                         0,
  19.                         sizeof(sockaddr_in)+16,
  20.                         sizeof(sockaddr_in)+16,
  21.                         &dwBytesRecv,
  22.                         &cbuffobj->ov))
  23.                 {
  24.                         result = ::WSAGetLastError();
  25.                         if(result!=WSA_IO_PENDING)
  26.                         {//失败了
  27.                                 return FALSE;
  28.                         }
  29.                 }
  30.                 return FALSE;
  31.         }
  32.         return TRUE;
  33. }
复制代码


说明:
过程顺序:Start()->WorkerThreadProc()->CheckIocpCommand->DoAccept()
问一:
其中SOCKET初始化,已在Start()中完成,为什么又要在DoAccept()中,又要去初始化一次,如果不初始化,WSASocket将无法创建SOCKET,
在DoAccept()中初始化后,得到SOKCET,但acceptex都报10038,这个socket有问题呀,
求原因
问二:
我把:DoAccept(),直接放入WorkerThreadProc中可以不用初始化SOKCET同时acceptEX也是OK的

问三:
经过我多次测试发现,把DoAccept(),放在WorkerThreadProc过程,while之前没问题,放在while里面就有错了





上一篇:大量数据运算
下一篇:easyhook例子用vs2015编译后xp无法运行

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-11-16 20:44

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表