IOCP中的WSARecv()失败,WSAGetLastError()返回值为6.

neicole neicole 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
IOCP句柄成功创建了,
Server与Client的Socket连通了,并且能够使用send()发送数据到客户端来正常通讯。
IOCP线程也创建成功了,能从调试那里看见八个线程。
只是,在刚刚接收到clientSocket后进行WSARecv()操作返回-1,使用WSAGetLastError()得到结果为6。

检查了一个晚上,看不出问题来,求各路人士帮忙看看,走过路过都帮顶顶~

将部分代码粘上:
// 这函数用于创建IOCP的ServerSocket.
void IocpServerSocket::startServer(DataManage * elem)
{
this -> IocpServerSocket::setDataManage(elem); // 按照最传统的流程来的啦~
this -> IocpServerSocket::createIocpHandle();
this -> IocpServerSocket::createWordThread();
this -> BaseSocket::createTcpSocket();
this -> ServerSocket::sbind();
this -> ServerSocket::slisten();
this -> IocpServerSocket::createAcceptClientThread();
return;
}


// 用于接收客户端Socket的线程
DWORD WINAPI IocpServerSocket::acceptClientThread(LPVOID IpParam)
{
IocpServerSocket * myIocp = (IocpServerSocket *) IpParam;
BaseSocket accClient;
while(true){
if(myIocp -> acceptClientSocket(accClient)){ // 接收客户端
myIocp -> connectClientIocp(accClient); // 客户端连接IOCP
myIocp -> createSocketRevRequest(accClient); // 创建从客户端的IOCP接收数据请求
if(NULL != myIocp->dataManage){
myIocp->dataManage->afterAcceSock(accClient);
}
}
}
return 0;
}

acceptClientSocket运行正常。。 就不粘上来啦~

int IocpServerSocket::connectClientIocp(const BaseSocket & elem)
{
// 创建用来和套接字关联的单句柄数据信息结构
BaseSocket * information = new BaseSocket(elem); // 再创指针是因为得将信息存放于(内存)堆中,删除操作将在数据获取函数中进行处理

// 将接受套接字和完成端口关联
HANDLE result = CreateIoCompletionPort((HANDLE)(information->getSocket()), completionPort, (DWORD)information, 0);
// ...
return 1;
}


下面这里不知道哪里错了,返回值是6

int IocpServerSocket::createSocketRevRequest(const BaseSocket & elem)
{
// 为投递I/O操作指定OVERLAPPED结构,在堆中创建好对象,准备在接收数据时再读取这对象的首地址
PerIoData * data = new PerIoData();
data -> operationType = PerIoData::readData;
data -> dataBuff.buf = data -> charBuf;
data -> dataBuff.len = PerIoData::defaultBufSize;
data -> dataByte = PerIoData::defaultBufSize;

DWORD Flags = 0; // 这数据很重要,在传参时不能删除,
int r = WSARecv(elem.getSocket(), &(data->dataBuff), 1, &data->dataByte, &Flags, &(data -> overlapped), NULL);
if(SOCKET_ERROR == r){
// #ifdef IO_STANDARD_STREAM_INFORMATION
std::cerr << "createSocketRevRequest Error:" << GetLastError() << std::endl;
system("pause");
// #endif
}
return r;
}


最后大家顺便看看这个有没错:
BaseSocket * outSocket = NULL; // 用以接收数据,起标志作用,无需初始化
PerIoData * outData = NULL;
int result = GetQueuedCompletionStatus(completionPort, &BytesTransferred, (PULONG_PTR)&outSocket, (LPOVERLAPPED*)&outData, WSA_INFINITE);

----------------------------------------------------

std::cerr << "createSocketRevRequest Error:" << GetLastError() << std::endl;
GetLastError为6,据 http://neicole.blog.51cto.com/5621716/974823 , 〖6〗-句柄无效.
不过IOCP不用句柄啊,重叠才用啊,然后就去找看看完成端口的句柄,发觉也正常啊,
completionPort = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0);
completionPort 非NULL.
然后。。。 不解,求解救~
...全文

相关推荐

Windows高性能TCP服务器:基于IOCP与MFC的核心原理与工程实践

在Windows平台进行C++高性能网络服务器开发时,I/O模型的选择直接决定了程序的并发处理能力与资源效率。传统的同步阻塞或select模型在面对海量连接时,常受限于线程开销或轮询效率。IOCP(I/O完成端口)作为Windows提供的原生异步I/O解决方案,其核心原理是“完成通知”机制。应用程序发起异步操作后,由内核在操作真正完成时,将通知放入完成端口队列,工作线程仅在有实际任务时被唤醒处理,实现了极高的可扩展性与资源利用率。这一技术价值在于能够构建出支撑数千甚至上万并发连接的服务器,广泛应用于游戏网关

weixin_34198453

MFC上位机集成IOCP实现高并发TCP通信

IOCP(输入输出完成端口)是Windows平台实现高并发网络通信的核心机制,其基于内核级异步I/O和线程池调度,可突破传统消息驱动模型的连接数瓶颈;原理上通过完成包队列与工作线程协作,避免消息泵阻塞与上下文切换开销,显著提升吞吐与响应实时性;技术价值在于支撑单机500+稳定长连接、低延迟数据采集与资源可控的工业级可靠性;典型应用于PLC数据采集、Modbus TCP上位机、仪器控制软件等Windows桌面工控系统;本文聚焦MFC框架下IOCP的零侵入集成方案,解决CSocket性能瓶颈与UI线程卡顿问题,

weixin_33788244

Windows IOCP高并发服务器开发:原理、架构与性能优化实战

在Windows平台高性能网络编程中,I/O完成端口(IOCP)是实现高并发服务器的核心技术。其原理基于异步I/O与事件驱动模型,通过操作系统内核统一管理I/O操作完成通知,将线程从阻塞等待中解放,实现真正的非阻塞处理。这项技术的核心价值在于能够用少量固定线程高效管理成千上万的并发连接,极大减少线程上下文切换开销,将CPU算力集中于业务逻辑处理。在游戏服务器、即时通讯系统、金融交易平台等高并发场景中,IOCP架构是支撑海量连接的关键基础设施。本文深入解析IOCP服务器的核心架构,包括事件驱动机制、单句柄数据

weixin_34413103

MFC对话框集成IOCP的TCP通信实战骨架

IOCP(输入/输出完成端口)是Windows高性能网络编程的核心机制,其本质是基于内核对象的异步I/O模型,通过线程池与完成队列实现海量并发连接的高效调度。相比select或WSAEventSelect,IOCP显著降低线程上下文切换开销,特别适用于需维持20+长连接、高频收发小包(如Modbus TCP心跳)的工业上位机场景。在MFC框架下落地IOCP面临三大技术挑战:UI线程与IOCP工作线程的资源隔离、CDialog对象跨线程安全访问、以及OVERLAPPED结构体与MFC生命周期的协同管理。本文聚

weixin_34146805

基于IOCP的Windows高性能TCP服务器:MFC实现与核心原理详解

在Windows平台高性能网络服务开发中,异步I/O与线程池的协同是核心技术。I/O完成端口(IOCP)作为Windows内核层面的异步I/O模型,通过“完成通知”机制实现真正的异步处理,避免了轮询带来的CPU浪费。其核心原理在于应用程序发起异步I/O操作后,由内核执行并在操作完成后将通知投递到完成端口队列,工作线程则等待并处理这些完成通知。这种模式的技术价值在于能够以最优线程数(通常为2倍CPU核心数)高效处理海量并发连接,显著提升吞吐量并减少线程切换开销。在实际应用场景中,IOCP模型特别适用于需要支撑

njit_peiyuan
评论 11
收藏 已收藏
分享
返回顶部
neicole
网络编程 18,356 成员 64,161 内容