网络编程技术_第82.pptVIP

  • 10
  • 0
  • 约2.68万字
  • 约 104页
  • 2017-03-23 发布于江苏
  • 举报
网络编程技术_第82

lpPerIOData-Buffer.len = MSGSIZE; lpPerIOData-Buffer.buf = lpPerIOData-szMessage; lpPerIOData-OperationType = RECV_POSTED; //异步的重叠I/O操作,未处理SOCKET_ERROR WSARecv(sClient, lpPerIOData-Buffer, 1, lpPerIOData-NumberOfBytesRecvd, lpPerIOData-Flags, lpPerIOData-overlap, NULL); } //结束的清理工作 PostQueuedCompletionStatus(CompletionPort, 0xFFFFFFFF, 0, NULL); //给子线程发信号 CloseHandle(CompletionPort); closesocket(sListen); WSACleanup(); return 0; } WORD WINAPI WorkerThread(LPVOID CompletionPortID) { //传进来的完成端口对象 HANDLE CompletionPort = (HANDLE)CompletionPortID; DWORD dwBytesTransferred; SOCKET sClient; LPPER_IO_OPERATION_DATA lpPerIOData = NULL; while (TRUE) { //取回完成端口的消息 GetQueuedCompletionStatus( CompletionPort, dwBytesTransferred, (DWORD*)sClient, (LPOVERLAPPED*)lpPerIOData, //小手段,将自定义数据结构强制转换为LPOVERLAPPED结构 INFINITE); if (dwBytesTransferred == 0xFFFFFFFF) { //收到主线程的结束标记 return 0; } if (lpPerIOData-OperationType == RECV_POSTED) { //判断操作 if (dwBytesTransferred == 0) { // 对方关闭套接字 closesocket(sClient); HeapFree(GetProcessHeap(), 0, lpPerIOData); } else { //原样发送回去 lpPerIOData-szMessage[dwBytesTransferred] = \0; send(sClient, lpPerIOData-szMessage, dwBytesTransferred, 0); memset(lpPerIOData, 0, sizeof(PER_IO_OPERATION_DATA)); lpPerIOData-Buffer.len = MSGSIZE; lpPerIOData-Buffer.buf = lpPerIOData-szMessage; lpPerIOData-OperationType = RECV_POSTED; WSARecv(sClient, //再次调用异步重叠I/O操作 lpPerIOData-Buffer, 1, lpPerIOData-NumberOfBytesRecvd, lpPerIOData-Flags, lpPerIOData-overlap, NULL); } } } return 0; } 几种winsock I/O模型的分析 ① select 模型: ??核心是select()函数,它可用于判断套接字上是否存在数据,或者能否向一个套接字写入数据。 该函数可以有效地防止应用程序在套接字处于阻塞模式时,send或recv进入阻塞状态;同时也可以防止在非阻塞模式产生大量的WSAEWOULDBLOCK错误。 优点:单线程管理多个套接字 缺点:调用select()前后都需要对所有套接字进行遍历操作。 ② WSAAsyncSelect 模型: ??? 以事件为基础使用消息机制,关键在于WSAAsyncSelect()函数,将socket消息发送到窗口上,然后在窗口过程函数中处理相应的FD_READ、FD_WRITE等网络事件。 优点: 1、WSAAsyncSelect和WSAEventSelect模型提供了读写数据能力的异步通知,但不提供数据的异步传输,而重叠及完成端口提供数据的异步传输。 2、可以在系统开销不

文档评论(0)

1亿VIP精品文档

相关文档