IOCP端口起不来

safeqq2 2018-04-27 11:07:29
真是奇怪了 代码没有异常跟踪也能继续下去 麻烦大家给我看看
使用netstat -an 看不到监听的端口
运行到__ACCPETEX 反复抛出 WSA_IO_PENDING 使用 accept 也无法查询到监听的端口


void* m_szTSock = NULL;
__sock_Create(&m_szTSock, TSOCK_USER_MODETCP | TSOCK_USER_IOCP | TSOCK_USER_SERVICE | TSOCK_USER_OVERAPPED, 65535, 10, (40 * 1024 * 1024), 0, NULL, 1111);



DWORD WINAPI __sock_WorkThread(PVOID m_lpPoint) {
if (m_lpPoint == NULL) return -1;
P__TSOCK m_szSocket = (P__TSOCK)m_lpPoint;
if (m_szSocket->initover == 0) return -2;
DWORD m_szTNumber = 0; ULONG_PTR m_lpUKey = 0; LPOVERLAPPED m_szOLapped = NULL; BOOL m_szRCode = 0;
while (m_szSocket->exit == 0) {
m_szRCode = GetQueuedCompletionStatus(m_szSocket->iocomple, &m_szTNumber, &m_lpUKey, &m_szOLapped, INFINITE);
Sleep(10);
}
return 0;
}


DWORD WINAPI __sock_Accpet(PVOID m_lpPoint) {
if (m_lpPoint == NULL) return -1;
P__TSOCK m_szSocket = (P__TSOCK)m_lpPoint; P__MEMNODE m_szMemNode = NULL; BOOL m_szRBool = FALSE;
if (m_szSocket->initover == 0) return -2;
if (m_szSocket->__AcceptEx == NULL) return -3;
if ((m_szSocket->optype & TSOCK_USER_SERVICE) == 0) return -4;
LPPER_IO_DATA m_lpOutBuff = NULL; unsigned long m_szRWLen = 0; unsigned long m_szInClient = 0; char m_szFaidNum = 0;
while (m_szSocket->exit == 0) {
m_szMemNode = NULL; m_lpOutBuff = NULL;
if (m_szSocket->umembuff == 0) { m_lpOutBuff = (LPPER_IO_DATA)malloc(sizeof(PER_IO_DATA)); if (m_lpOutBuff == NULL) { break; }; }
else { if (__mem_Write(m_szSocket->mempoint, "0", sizeof(PER_IO_DATA), &m_szRWLen, &m_szMemNode) != 1){ break; } m_lpOutBuff = (LPPER_IO_DATA)(((unsigned char*)m_szMemNode) + sizeof(__MEMNODE)); }
::memset(m_lpOutBuff, 0, sizeof(PER_IO_DATA));
m_lpOutBuff->dateLen = sizeof(m_lpOutBuff->dataBuff); m_lpOutBuff->opType = 1;
if (m_szSocket->smode == 1) { m_lpOutBuff->client = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, m_szSocket->eiocp); }
else { m_lpOutBuff->client = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, 0, m_szSocket->eiocp); }
if (m_lpOutBuff->client == INVALID_SOCKET) break;
NEXTINCLIENT:NULL;
m_szRBool = m_szSocket->__AcceptEx(m_szSocket->hsocket, m_lpOutBuff->client, m_lpOutBuff->dataBuff, m_lpOutBuff->dateLen - ((sizeof(sockaddr_in) + 16) * 2), sizeof(sockaddr_in) + 16, sizeof(sockaddr_in) + 16, &m_lpOutBuff->arLen, &(m_lpOutBuff->overLapped));
if (WSA_IO_PENDING == WSAGetLastError() && m_szFaidNum == 0) { ++m_szFaidNum; Sleep(0); goto NEXTINCLIENT; }
if (m_szRBool == FALSE) {
if (m_szFaidNum == 0) {break;}
m_lpOutBuff->iClientLen = sizeof(m_lpOutBuff->iClient);
m_lpOutBuff->client = ::accept(m_szSocket->hsocket, &m_lpOutBuff->iClient, &m_lpOutBuff->iClientLen);
//m_lpOutBuff->client = ::accept(m_szSocket->hsocket, NULL, NULL);
if (m_lpOutBuff->client == SOCKET_ERROR || m_lpOutBuff->client == INVALID_SOCKET) { break; }
m_lpOutBuff->ifClient = 1;
}
if (m_szSocket->eiocp == 1) { if (::CreateIoCompletionPort((HANDLE)m_lpOutBuff->client, m_szSocket->iocomple, (ULONG_PTR)&m_lpOutBuff, 0) == NULL) { break; } }
if (m_szInClient >= m_szSocket->mconnect) { Sleep(0); goto NEXTINCLIENT; }
++m_szInClient;
}
int m_szGCode = ::GetLastError();
int m_szSCode = ::WSAGetLastError();
if (m_lpOutBuff != NULL) { if (m_szSocket->umembuff == 0) { free(m_lpOutBuff); m_lpOutBuff = NULL; } else { __mem_Free(m_szSocket->mempoint); } }
return ::WSAGetLastError();
}

char __sock_Create(void** i_lpToint, unsigned char i_szType, unsigned long m_szMConnect, unsigned long i_szMListen, unsigned long i_szMSize, unsigned long i_szTNumber, char* i_lpIp, unsigned short i_szPort) {
if (i_lpToint == NULL) return -1;
P__TSOCK m_szSocket = (P__TSOCK)*i_lpToint; char m_szIsCreate = 0; char m_szECode = 0;
if (*i_lpToint == NULL) { m_szSocket = (P__TSOCK)malloc(sizeof(__TSOCK)); if (m_szSocket == NULL) { return -2; } m_szIsCreate = 1; }
::memset(m_szSocket, 0, sizeof(__TSOCK));
if (i_szMSize != 0 && (i_szType & TSOCK_USER_SERVICE) != 0) {
if (__mem_Create(0, i_szMSize, 0, &m_szSocket->mempoint) != 1) { if (m_szIsCreate == 1) { free(m_szSocket); } return -3; }
m_szSocket->memsize = i_szMSize; m_szSocket->umembuff = 1;
}
m_szSocket->systnumber = i_szTNumber; m_szSocket->mconnect = m_szMConnect; if (m_szSocket->mconnect == 0) { m_szSocket->mconnect = 0xFFFFFFFE; }
if (i_szTNumber == 0) { SYSTEM_INFO si; GetSystemInfo(&si); m_szSocket->systnumber = si.dwNumberOfProcessors * 2; }
if ((i_szType & TSOCK_USER_MODETCP) != 0) { m_szSocket->smode = 1; }
//TransmitFile();
if ((i_szType & TSOCK_USER_OVERAPPED) != 0) {
m_szSocket->iocomple = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, m_szSocket->systnumber);
if (m_szSocket->iocomple == NULL) { m_szECode = -4; goto ERROREXITTCREATE; }
m_szSocket->eiocp = 1;
}
if (m_szSocket->workthread == NULL) {
m_szSocket->workthread = new void*[m_szSocket->systnumber];
if (m_szSocket->workthread == NULL) { m_szECode = -5; goto ERROREXITTCREATE; }
for (unsigned long i = 0; i != m_szSocket->systnumber; ++i) { m_szSocket->workthread[i] = ::CreateThread(NULL, NULL, __sock_WorkThread, m_szSocket, NULL, NULL); if (m_szSocket->workthread[i] == NULL) { m_szECode = -6; goto ERROREXITTCREATE; } }
}
m_szECode = -8; m_szSocket->mlisten = i_szMListen;
if (WSAStartup(MAKEWORD(2, 2), &m_szSocket->wsaData) != 0) {goto ERROREXITTCREATE;}
if (m_szSocket->smode == 1) { m_szSocket->hsocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, m_szSocket->eiocp);}
else { m_szSocket->hsocket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, m_szSocket->eiocp); }
if (m_szSocket->hsocket == INVALID_SOCKET) { m_szECode = -9; goto ERROREXITTCREATE; }
if (m_szSocket->eiocp == 1) { if (::CreateIoCompletionPort((HANDLE)m_szSocket->hsocket, m_szSocket->iocomple, (ULONG_PTR)&m_szSocket, 0) == NULL) { m_szECode = -11; goto ERROREXITTCREATE; } }
::memset(&m_szSocket->wsaAddress, 0, sizeof(m_szSocket->wsaAddress));
m_szSocket->wsaAddress.sin_family = AF_INET; m_szSocket->wsaAddress.sin_port = i_szPort;
if (i_szPort == 0 && (i_szType & TSOCK_USER_SERVICE) != 0) { m_szSocket->wsaAddress.sin_port = htons(10588); }
if (i_lpIp == NULL) { m_szSocket->wsaAddress.sin_addr.s_addr = htonl(INADDR_ANY); }else { m_szSocket->wsaAddress.sin_addr.s_addr = inet_addr(i_lpIp);}
if (::bind(m_szSocket->hsocket, (struct sockaddr *)&m_szSocket->wsaAddress, sizeof(m_szSocket->wsaAddress)) == SOCKET_ERROR) { m_szECode = -10; goto ERROREXITTCREATE; }
if ((i_szType & TSOCK_USER_SERVICE) != 0) { if (::listen(m_szSocket->hsocket, m_szSocket->mlisten) == SOCKET_ERROR) { m_szECode = -13; goto ERROREXITTCREATE; } }
m_szSocket->initover = 1; m_szSocket->optype = i_szType;
if (m_szSocket->__AcceptEx == NULL && (i_szType & TSOCK_USER_SERVICE) != 0) {
GUID GuidAcceptEx = WSAID_ACCEPTEX; DWORD dwBytes = 0;
if (WSAIoctl(m_szSocket->hsocket, SIO_GET_EXTENSION_FUNCTION_POINTER, &GuidAcceptEx, sizeof(GuidAcceptEx), &m_szSocket->__AcceptEx, sizeof(m_szSocket->__AcceptEx), &dwBytes, NULL, NULL) != SOCKET_ERROR) {
m_szSocket->__AcceptEx = AcceptEx;
}
m_szSocket->acceptthdr = ::CreateThread(NULL, NULL, __sock_Accpet, m_szSocket, NULL, NULL);
if (m_szSocket->acceptthdr == NULL) { m_szECode = -12; goto ERROREXITTCREATE; }
}
m_szECode = 1; goto SUCCECEXITTCREATE;
ERROREXITTCREATE:NULL;
if (m_szSocket->workthread != NULL) {
for (unsigned long i = 0; i != m_szSocket->systnumber; ++i) { if (m_szSocket->workthread[i] != NULL) { for (unsigned long x = 0; x != m_szSocket->workrunnum; ++x) { ::PostQueuedCompletionStatus(m_szSocket->iocomple, NULL, NULL, NULL); } } }Sleep(100);
for (unsigned long i = 0; i != m_szSocket->systnumber; ++i) { if (m_szSocket->workthread[i] != NULL) { ::CloseHandle(m_szSocket->workthread[i]); m_szSocket->workthread[i] = NULL; } }
::CloseHandle(m_szSocket->workthread); delete[] m_szSocket->workthread; m_szSocket->workthread = NULL;
}
if (m_szSocket->umembuff == 1) { __mem_Free(m_szSocket->mempoint); m_szSocket->mempoint = NULL; }
if (m_szSocket->iocomple != NULL) { ::CloseHandle(m_szSocket->iocomple); m_szSocket->iocomple = NULL; }
if (m_szSocket->hsocket != NULL) { ::closesocket(m_szSocket->hsocket); m_szSocket->hsocket = NULL; }
if (m_szSocket->acceptthdr != NULL) { ::CloseHandle(m_szSocket->acceptthdr); m_szSocket->acceptthdr = NULL; }
if (m_szECode > -8) { ::WSACleanup(); }
if (m_szIsCreate == 1) { free(m_szSocket); m_szSocket = NULL; }
int m_szGCode = ::GetLastError();
int m_szSCode = ::WSAGetLastError();
return m_szECode;
SUCCECEXITTCREATE:NULL;
return m_szECode;
}



...全文
1047 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-04-28
  • 打赏
  • 举报
回复

18,356

社区成员

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

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