微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对于与IOCP端口相关联的套接字,WSARecv有时会返回“无效句柄错误编号6” C ++

我试图写一个服务器,可以同时支持多个客户端连接,所以我试图用IOCP做到这一点。 所以,让我简单介绍一下我的代码stream,然后我可以解释我的问题。 首先,服务器正在打开一个端口,用于监听和等待新的传入连接的“接受”呼叫。 为了参考,我使用了与这里提到的相同的代码。因此,它接受每个新的传入连接并返回一个新的套接字描述符(sd),然后将其标记为非阻塞:

arg = 1; ioctlsocket(sd,FIONBIO,&arg);

然后启用TCP_NODELAY:

level = IPPROTO_TCP; optName = TCP_NODELAY; value = 1; setsockopt(sd,level,optName,(const char*)&value,sizeof(value));

此后与IOCP端口关联为:

CreateIoCompletionPort((HANDLE)sd,iocp_port,(DWORD)completion_key,4);

completion_key是一个类对象,它只是一个容器,它包含数据缓冲区,重叠缓冲区,查询typesrecv / send等,并在上次发出读取调用

DuplicateHandle错误:error_invalid_handle

你能解释什么是符号和debugging在C ++世界的符号?

在Windows中有一个相当于gcc的?

使用原始套接字重新传输大型数据包

如何强制程序出现内存不足?

WSARecv(sd,wsabuf,1,&bytes,&flags,overlapped,NULL);

wsabuf和overlapped是completion_key对象的一部分。

在90%的情况下,它工作正常,即当这个套接字上有一些input数据可用时,“GetQueuedCompletionStatus”被取消阻止,并且它有有效的数据。 但有时WSARecv调用返回一个错误,GetLastError()返回6这是“无效句柄”的错误我有点困惑,为什么这样发生。

我正在创build一个iocp端口的方式:

iocp_port = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0);

并有一些正在等待“GetQueuedCompletionStatus”的线程。

是否有一个规范的方式来重新sorting对象的DACL后添加一个ACE?

如何拖拽大量的文件而不消耗系统资源?

Win10中的EnumWindows函数只枚举桌面应用程序

在linux中获取USB设备添加通知的最佳方式

为什么getsockopt返回一个错误

我监视了在后台发生的所有系统调用。 WSARecv在内部调用NtDeviceIoControlFile,并且有一个参数“Event”,它与在WSARecv的lpOverlapped结构中作为hEvent传递的参数相同。 我没有设置hEvent为NULL,所以它是一些垃圾值,当它是NULL,然后NtDeviceIoControlFile成功返回和其他情况下,它返回“INVALID_HANDLE”错误。 不幸的是,大部分时间都是空的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐