AcceptEx返回FALSE而WSAGetLastError却返回0,叫我情何以堪!
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;
}
相关推荐
高性能并发IOCP 网络编程
///////////////////////////////////////////////////////////////// // 初始化Socket bool CIOCPModel::_InitializeListenSocket() { // AcceptEx 和 GetAcceptExSockaddrs 的GUID,用于导出函数指针 GUID GuidAcceptEx = WSAID_ACCEPTEX; GUID GuidGetAcceptExSockAddrs = WSAID_GETACCEPTEXSOCKADDRS; // 服务器地址信息,用于绑定Socket struct sockaddr_in ServerAddress; // 生成用于监听的Socket的信息 m_pListenContext = new PER_SOCKET_CONTEXT; // 需要使用重叠IO,必须得使用WSASocket来建立Socket,才可以支持重叠IO操作 m_pListenContext->m_Socket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); if (INVALID_SOCKET == m_pListenContext->m_Socket) { this->_ShowMessage("初始化Socket失败,错误代码: %d.\n", WSAGetLastError()); return false; } else { TRACE("WSASocket() 完成.\n"); } // 将Listen Socket绑定至完成端口中 if( NULL== CreateIoCompletionPort( (HANDLE)m_pListenContext->m_Socket, m_hIOCompletionPort,(DWORD)m_pListenContext, 0)) { this->_ShowMessage("绑定 Listen Socket至完成端口失败!错误代码: %d/n", WSAGetLastError()); RELEASE_SOCKET( m_pListenContext->m_Socket ); return false; } else { TRACE("Listen Socket绑定完成端口 完成.\n"); } // 填充地址信息 ZeroMemory((char *)&ServerAddress, sizeof(ServerAddress)); ServerAddress.sin_family = AF_INET; // 这里可以绑定任何可用的IP地址,或者绑定一个指定的IP地址 //ServerAddress.sin_addr.s_addr = htonl(INADDR_ANY); ServerAddress.sin_addr.s_addr = inet_addr(m_strIP.GetString()); ServerAddress.sin_port = htons(m_nPort); // 绑定地址和端口 if (SOCKET_ERROR == bind(m_pListenContext->m_Socket, (struct sockaddr *) &ServerAddress, sizeof(ServerAddress))) { this->_ShowMessage("bind()函数执行错误.\n"); return false; } else { TRACE("bind() 完成.\n"); } // 开始进行监听 if (SOCKET_ERROR == listen(m_pListenContext->m_Socket,SOMAXCONN)) { this->_ShowMessage("Listen()函数执行出现错误.\n"); return false; } else { TRACE("Listen() 完成.\n"); } // 使用AcceptEx函数,因为这个是属于WinSock2规范之外的微软另外提供的扩展函数 // 所以需要额外获取一下函数的指针, // 获取AcceptEx函数指针 DWORD dwBytes = 0; if(SOCKET_ERROR == WSAIoctl
Windows IOCP高性能服务器开发:从原理到C++实战源码解析
在网络编程中,高并发处理是核心挑战。传统的同步阻塞模型和多线程模型在连接数激增时,会面临线程资源耗尽、上下文切换开销大以及锁竞争激烈等问题,导致性能瓶颈。为了解决这些难题,异步I/O模型应运而生,它通过事件驱动机制,让少量线程高效管理海量网络连接,将CPU资源集中于实际的数据处理。在Windows平台上,I/O完成端口(IOCP)正是这一理念的集大成者,它通过内核级的完成通知队列和智能的线程调度,实现了真正的可扩展高性能。IOCP的核心价值在于其“完成时通知”机制,应用程序只需提交I/O请求并等待操作完成,
Windows高性能TCP服务器:基于IOCP与MFC的核心原理与工程实践
在Windows平台进行C++高性能网络服务器开发时,I/O模型的选择直接决定了程序的并发处理能力与资源效率。传统的同步阻塞或select模型在面对海量连接时,常受限于线程开销或轮询效率。IOCP(I/O完成端口)作为Windows提供的原生异步I/O解决方案,其核心原理是“完成通知”机制。应用程序发起异步操作后,由内核在操作真正完成时,将通知放入完成端口队列,工作线程仅在有实际任务时被唤醒处理,实现了极高的可扩展性与资源利用率。这一技术价值在于能够构建出支撑数千甚至上万并发连接的服务器,广泛应用于游戏网关
Windows IOCP高性能服务器开发实战:从原理到百万级并发框架
在服务器开发领域,异步I/O模型是构建高并发、低延迟网络服务的核心技术。其核心原理在于将I/O操作请求提交后,由操作系统在操作真正完成时进行回调通知,从而避免了传统同步阻塞模型中的线程轮询开销与上下文切换瓶颈。这一技术价值在于能够充分利用系统资源,实现海量连接的高效管理,尤其适用于游戏服务器、实时通信和金融交易网关等对性能要求苛刻的应用场景。完成端口(IOCP)作为Windows平台原生支持的异步I/O终极方案,通过其独特的完成通知机制与线程池协同,为开发者提供了强大的底层支持。本文基于一套经过生产环境验证
Windows IOCP高并发服务器开发:原理、架构与性能优化实战
在Windows平台高性能网络编程中,I/O完成端口(IOCP)是实现高并发服务器的核心技术。其原理基于异步I/O与事件驱动模型,通过操作系统内核统一管理I/O操作完成通知,将线程从阻塞等待中解放,实现真正的非阻塞处理。这项技术的核心价值在于能够用少量固定线程高效管理成千上万的并发连接,极大减少线程上下文切换开销,将CPU算力集中于业务逻辑处理。在游戏服务器、即时通讯系统、金融交易平台等高并发场景中,IOCP架构是支撑海量连接的关键基础设施。本文深入解析IOCP服务器的核心架构,包括事件驱动机制、单句柄数据


网络编程
