我试图写一个服务器,可以同时支持多个客户端连接,所以我试图用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函数只枚举桌面应用程序
我监视了在后台发生的所有系统调用。 WSARecv在内部调用NtDeviceIoControlFile,并且有一个参数“Event”,它与在WSARecv的lpOverlapped结构中作为hEvent传递的参数相同。 我没有设置hEvent为NULL,所以它是一些垃圾值,当它是NULL,然后NtDeviceIoControlFile成功返回和其他情况下,它返回“INVALID_HANDLE”错误。 不幸的是,大部分时间都是空的。