对于与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”错误。 不幸的是,大部分时间都是空的。

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...