现在摆在面前的就是如何高效的读写数据,与磁盘操作做类比,当接收到WSAAsyncSelect对应的消息或者WSAEvent返回时就是执行读写操作的时机,下面紧接着就是调用对应的读写函数来进行读写数据了,而联想到linux...ReadFile和WriteFile来支持重叠IO,但是WinSock2.0 中重新设计的一套函数来支持重叠IO WSASend (send的等价函数) WSASendTo (sendto的等价函数) WSARecv...利用该模型首先需要把一个event对象绑定到OVERLAPPED(WinSokc中一般是WSAOVERLAPPED)上,然后利用这个OVERLAPPED结构来进行IO操作.如:WSASend/WSARecv...这主要是因为对于每个重叠I/O操作(WSASend/WSARecv等)来说,都必须额外创建一个Event对象。对于一个I/O密集型SOCKET应用来说,这种消耗会造成资源的严重浪费。...在循环中接收连接,当有新客户端连接进来时创建对应的客户端结构,然后调用WSARecv函数接收数据,接下来就是使用SleepEx进入可警告状态,以便让完成历程有机会执行。
DB.DB().SetConnMaxLifetime(59 * time.Second)
异步IO请求分为:连接、接收、发送,分别对应AcceptEx、WSARecv、WSASend。 三参数:单句柄数据结构、单IO数据结构、传输字节数。...databuf.buf = ppiod->buf; databuf.len = BUF_LEN; DWORD dwRecv = 0; DWORD dwFlags = 0; WSARecv...网上很多IOCP模型:主线程循环accept等待连接的到来,然后将Client socket加入IOCP,同时在Client socket上投递WSARecv等待数据到来。...假设在socket 1上投递了三个WSARecv, 当Client关闭连接时,会有三个连接断开返回,不要重复释放空间。...需要考虑连接被Client断开时所有异步WSARecv均返回不会重复delete PER_HANDLE_DATA AutoLock lock(pphd->mutex); if(pphd-
这就是常用的IO复用函数的用途,如select函数、linux下的poll函数。这是中级做法。 NO3. 使用IO复用技术主动检测数据是否可读可写,也存在问题。...有,这就是linux下的epoll模型和windows下的WSAAsyncSelect和完成端口模型。这是高级做法。 NO4....请求 int nBytesRecv = WSARecv( pIoContext->m_sockAccept, p_wbuf, 1, &dwBytes...= WSAGetLastError())) { this->_ShowMessage(_T("投递第一个WSARecv失败!"))...所以从某种意义上来说WSARecv函数并不是收取数据,而更像是安排让操作系统收数据的设置。
调用WSASend准备发送数据工作 或调用WSARecv准备接收数据工作(这一步,不是必须)*/ } //普通客户端socket收发数据 else...//解析收到的数据(这一步,不是必须) //调用WSASend准备发送数据工作(比如应答客户端)(这一步,不是必须) //继续调用WSARecv...准备收取数据工作(这一步,不是必须) } else if (pIOContext->Type == 发) { //调用WSARecv
WSABUF 参数 在WSASend 和WSARecv的参数中总有一个WSABUF的参数,这个参数很简单的就只有一个缓冲区指针和缓冲区长度,加上函数后面表示WSABUF的个数的参数,很容易想到这些函数可以发送...作为WSASend、WSASendto、WSARecv、WSARecvFrom等函数的数组参数,最终WSABUF数组可以描述多个分散的缓冲块用于收发。...的信息,注意这里在提交WSARecv时给的缓冲是NULL,这里表示我只需要一个完成的通知,在完成收到客户端数据后会触发FD_READ,而不需要进行数据的写入,一般在提交WSARecv后,系统内核会锁住我们提供的...特别是在服务端需要频繁的调用WSASend、WSARecv这样的操作,如果每一个都锁定一定的缓冲,这个内存消耗也是惊人的。所以这里传入NULL,只让其进行事件通知,而写入的操作由程序自己做。...比如在WSARecv的完成通知中,将接收到的缓冲直接传递给QueueUserWorkItem线程池方法,启动线程池中的线程去处理数据,而IOCP线程池则继续专心于网络服务。
m_Overlapped; pIoContext->ResetBuffer(); pIoContext->m_OpType = RECV_POSTED; // 初始化完成后,,投递WSARecv...请求 int nBytesRecv = WSARecv( pIoContext->m_sockAccept, p_wbuf, 1,...= WSAGetLastError())) { this->_ShowMessage(_T("投递第一个WSARecv失败!"))...ntohs(ClientAddr->sin_port), pIoContext->m_wsaBuf.buf ); // 然后开始投递下一个WSARecv.../////////////////////////////////////////////////////////// // 判断客户端Socket是否已经断开,否则在一个无效的Socket上投递WSARecv
pPerIO->buf; buf.len = BUFFER_SIZE; DWORD dwRecv; DWORD dwFlags = 0; ::WSARecv...pPerIO->nOperationType = OP_READ; DWORD nFlags = 0; ::WSARecv
(2)传输数据 在重叠I/O模型中,传输数据的函数是WSASend\WSARecv(TCP)和WSASendTo、WSARecvFrom等,下面是WSASend的定义: The WSASend...这就是调用重叠操作(WSARecv()、 WSARecvFrom()、WSASend()、WSASendTo() 或 WSAIoctl())时指定的那个套接口。...如果重叠操作为 WSARecv()或WSARecvFrom(),则本参数包含lpFlags参数所需的结果。 返回值: 如果函数成功,则返回值为真TRUE。...=WSA_IO_PENDING) { printf("WSARecv() failed with error %d\n",WSAGetLastError());...=WSA_IO_PENDING) { printf("WSARecv() failed with error %d\n",WSAGetLastError());
/bbs.csdn.net/topics/390719212 //1.关闭窗口或者停止调试windows会释放句柄的,socket会被关闭并向对方发送断开连接 //2.对方关闭socket后,WSARecv...WSABUF wsabuf; wsabuf.buf = PerIoData->buffer; wsabuf.len = sizeof(PerIoData->buffer); iRes = WSARecv...completionPort, (DWORD)PerSocketData, 0); // 开始在接受套接字上处理I/O使用重叠I/O机制 // 在新建的套接字上投递一个或多个异步 // WSARecv...= 0; WSABUF wsabuf; wsabuf.buf = PerIoData->buffer; wsabuf.len = sizeof(PerIoData->buffer); WSARecv
调用WSASend准备发送数据工作或调用WSARecv准备接收数据工作 (这一步,不是必须)*/ } //普通客户端socket收发数据 else.../(这一步,不是必须) //调用WSASend准备发送数据工作 //(比如应答客户端)(这一步,不是必须) //继续调用WSARecv...//(这一步,不是必须) } else if (pIOContext->Type == 发) { //调用WSARecv
在文件中我们也提到过完成端口,其实我们利用Linux上一切皆文件的思想来考虑这个问题就可以很方便的理解,既然我们需要异步的方式来读写网卡的信息,这与读写文件的方式类似,既然文件中存在完成端口模型,网络上存在也就不足为奇了...= FD_READ; AcceptOverlapped.m_pszBuf = buf.buf; AcceptOverlapped.m_sClient = sClient; WSARecv...创建对应的扩展结构并调用WSARecv投递一个接收操作。由于后面的收发操作都在对应的线程中操作,因此在主线程中只需要等待即可。当用户确定退出时。...因此又有了重叠IO的模型和一些列的新的API,向WSARecv和WSASend等等函数。
api.github.com/repos/boot2docker/boot2docker/releases/latest: read tcp 172.16.4.109:51024->13.250.168.23:443: wsarecv
WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP, NULL,0,WSA_FLAG_OVERLAPPED); 2传输数据:WSASend WSARecv
n" << WSAGetLastError() << endl; return FALSE; } // 开始在接受套接字上处理I/O使用重叠I/O机制 // 在新建的套接字上投递一个或多个异步 // WSARecv...databuff.len = PerIoData->BufferLen = 1024; cout << "wait for data arrive(Accept)..." << endl; Flags = 0; if (WSARecv...&(PerIoData->overlapped), NULL) == SOCKET_ERROR) if (WSAGetLastError() == WSA_IO_PENDING) cout buffer;//buf是个指针,这一过程会清空buffer的内容 PerIoData->operationType = RECV; // read WSARecv
p_IOCPhandle->recv_buff; p_IOdata->buf.len = BUFF_SIZE; p_IOdata->flags = 0; int nBytesRecv = WSARecv...p_accepthandle->recv_buff; p_iodata->buf.len = BUFF_SIZE; p_iodata->flags = 0; int nBytesRecv = WSARecv
lpIOContext->nBytes = nBytes; ZeroMemory(&lpIOContext->Overlapped, sizeof(lpIOContext->Overlapped)); nRet = WSARecv...WSAID_ACCEPTEX, WSAID_GETACCEPTEXSOCKADDRS} ZeroMemory(&io_data->Overlapped, sizeof(io_data->Overlapped)); if (WSARecv...io_data->Overlapped, NULL) == SOCKET_ERROR) { if (WSAGetLastError() == WSA_IO_PENDING) { cout << "WSARecv...wsabuf.len = sizeof(buffer); // data->client = client; // DWORD nBytes= 1024 ,dwFlags=0; // int nRet = WSARecv
领取专属 10元无门槛券
手把手带您无忧上云