﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-上善若静水</title><link>http://www.cppblog.com/cctoqh/</link><description>while(effort=true){success++;}
</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:09:05 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:09:05 GMT</pubDate><ttl>60</ttl><item><title>Windows网络编程：WSAAsynSelect的基本使用</title><link>http://www.cppblog.com/cctoqh/archive/2011/09/08/155342.html</link><dc:creator>上善若静水</dc:creator><author>上善若静水</author><pubDate>Thu, 08 Sep 2011 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2011/09/08/155342.html</guid><wfw:comment>http://www.cppblog.com/cctoqh/comments/155342.html</wfw:comment><comments>http://www.cppblog.com/cctoqh/archive/2011/09/08/155342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cctoqh/comments/commentRss/155342.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cctoqh/services/trackbacks/155342.html</trackback:ping><description><![CDATA[<div>WSAAsynSelect的基本使用，下面是一个简单的例子<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">windows.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br />#pragma&nbsp;comment(lib,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ws2_32.lib</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;LISTEN_PORT&nbsp;&nbsp;5080</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;UWM_SOCKET&nbsp;WM_USER+1</span><span style="color: #000000; "><br /><br />TCHAR&nbsp;szClassName[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAAsynSelectClass</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />TCHAR&nbsp;szWndName[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAAsynSelectWnd</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />LRESULT&nbsp;CALLBACK&nbsp;MainWndProc(HWND&nbsp;hwnd,&nbsp;UINT&nbsp;uMsg,&nbsp;WPARAM&nbsp;wParam,LPARAM&nbsp;lParam);<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;WINAPI&nbsp;WinMain(HINSTANCE&nbsp;hInstance,&nbsp;HINSTANCE&nbsp;hPrevInstance,&nbsp;LPSTR&nbsp;lpCmdLine,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nShowCmd)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WNDCLASS&nbsp;wndClass&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">0</span><span style="color: #000000; ">};<br />&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;hMainWnd;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MSG&nbsp;msg;<br />&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;wsaData;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ret;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;listen_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;TCHAR&nbsp;szErrorMsg[</span><span style="color: #000000; ">256</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN&nbsp;listen_addr;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAStartup(MAKEWORD(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wsaData);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szErrorMsg,&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAStartup&nbsp;failed.&nbsp;Error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;szErrorMsg,&nbsp;szWndName,&nbsp;MB_OK);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;ret;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;listen_sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;IPPROTO_TCP);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(INVALID_SOCKET&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;listen_sock)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szErrorMsg,&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">socket&nbsp;failed,&nbsp;Error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;szErrorMsg,&nbsp;szWndName,&nbsp;MB_OK);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_family&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htonl(INADDR_ANY);<br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_port&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htons(LISTEN_PORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bind(listen_sock,&nbsp;(SOCKADDR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">listen_addr,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(listen_addr));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szErrorMsg,&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bind&nbsp;failed.&nbsp;Error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;szErrorMsg,&nbsp;szWndName,&nbsp;MB_OK);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;wndClass.style&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CS_HREDRAW&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;CS_VREDRAW;<br />&nbsp;&nbsp;&nbsp;&nbsp;wndClass.cbClsExtra&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;wndClass.cbWndExtra&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;wndClass.hbrBackground&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;GetStockObject(WHITE_BRUSH);<br />&nbsp;&nbsp;&nbsp;&nbsp;wndClass.hCursor&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;LoadCursor(NULL,&nbsp;IDC_ARROW);<br />&nbsp;&nbsp;&nbsp;&nbsp;wndClass.hIcon&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;LoadIcon(NULL,&nbsp;IDI_APPLICATION);<br />&nbsp;&nbsp;&nbsp;&nbsp;wndClass.hInstance&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;hInstance;<br />&nbsp;&nbsp;&nbsp;&nbsp;wndClass.lpfnWndProc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;MainWndProc;<br />&nbsp;&nbsp;&nbsp;&nbsp;wndClass.lpszClassName&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;szClassName;<br />&nbsp;&nbsp;&nbsp;&nbsp;wndClass.lpszMenuName&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">RegisterClass(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wndClass))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szErrorMsg,&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">RegisterClass&nbsp;failed.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;szErrorMsg,&nbsp;szWndName,&nbsp;MB_OK);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;hMainWnd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CreateWindow(szClassName,&nbsp;szWndName,&nbsp;WS_OVERLAPPEDWINDOW&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;WS_VSCROLL,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CW_USEDEFAULT,&nbsp;CW_USEDEFAULT,&nbsp;CW_USEDEFAULT,&nbsp;CW_USEDEFAULT,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;NULL,&nbsp;hInstance,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(NULL&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;hMainWnd)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szErrorMsg,&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">CreateWindow&nbsp;failed.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;szErrorMsg,&nbsp;szWndName,&nbsp;MB_OK);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UnregisterClass(szClassName,&nbsp;hInstance);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(hMainWnd,&nbsp;nShowCmd);<br />&nbsp;&nbsp;&nbsp;&nbsp;UpdateWindow(hMainWnd);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAAsyncSelect(listen_sock,&nbsp;hMainWnd,&nbsp;UWM_SOCKET,&nbsp;FD_ACCEPT</span><span style="color: #000000; ">|</span><span style="color: #000000; ">FD_CLOSE);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szErrorMsg,&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAAsyncSelect&nbsp;failed.&nbsp;Error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;szErrorMsg,&nbsp;szWndName,&nbsp;MB_OK);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;listen(listen_sock,&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szErrorMsg,&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen&nbsp;failed.&nbsp;Error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;szErrorMsg,&nbsp;szWndName,&nbsp;MB_OK);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(GetMessage(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">msg,&nbsp;NULL,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">msg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">msg);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />rettag2:<br />&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />rettag1:<br />&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}<br /><br />LRESULT&nbsp;CALLBACK&nbsp;MainWndProc(HWND&nbsp;hwnd,&nbsp;UINT&nbsp;uMsg,&nbsp;WPARAM&nbsp;wParam,LPARAM&nbsp;lParam)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TCHAR&nbsp;szErrorMsg[</span><span style="color: #000000; ">256</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;szMsg[</span><span style="color: #000000; ">256</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;client_sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;INVALID_SOCKET;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN&nbsp;client_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;client_addr_len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(client_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ret;<br />&nbsp;&nbsp;&nbsp;&nbsp;HDC&nbsp;hdc;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;row&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;TEXTMETRIC&nbsp;textMetric;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;textHeight&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;hdc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;GetDC(hwnd);<br />&nbsp;&nbsp;&nbsp;&nbsp;GetTextMetrics(hdc,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">textMetric);<br />&nbsp;&nbsp;&nbsp;&nbsp;textHeight&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;textMetric.tmHeight;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">switch</span><span style="color: #000000; ">(uMsg)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;WM_DESTROY:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(hwnd,&nbsp;hdc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;UWM_SOCKET:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSAGETSELECTERROR(lParam))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szErrorMsg,&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAGETSELECTERROR&nbsp;failed.&nbsp;Error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;WSAGETSELECTERROR(lParam));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;szErrorMsg,&nbsp;szWndName,&nbsp;MB_OK);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">switch</span><span style="color: #000000; ">(WSAGETSELECTEVENT(lParam))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;FD_ACCEPT:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client_sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;accept(wParam,&nbsp;(SOCKADDR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client_addr,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client_addr_len);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(INVALID_SOCKET&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;client_sock)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szErrorMsg,&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept&nbsp;failed.&nbsp;Error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;szErrorMsg,&nbsp;szWndName,&nbsp;MB_OK);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf_s(szMsg,&nbsp;</span><span style="color: #000000; ">256</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept&nbsp;client:%s:%d.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;inet_ntoa(client_addr.sin_addr),&nbsp;client_addr.sin_port);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxA(NULL,&nbsp;szMsg,&nbsp;"Information",&nbsp;MB_OK);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOutA(hdc,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;row,&nbsp;szMsg,&nbsp;strlen(szMsg));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;textHeight;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAAsyncSelect(client_sock,&nbsp;hwnd,&nbsp;UWM_SOCKET,&nbsp;FD_READ</span><span style="color: #000000; ">|</span><span style="color: #000000; ">FD_WRITE</span><span style="color: #000000; ">|</span><span style="color: #000000; ">FD_CLOSE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szErrorMsg,&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAAsyncSelect&nbsp;failed.&nbsp;Error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;szErrorMsg,&nbsp;szWndName,&nbsp;MB_OK);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;FD_READ:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recv(wParam,&nbsp;szMsg,&nbsp;</span><span style="color: #000000; ">256</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szErrorMsg,&nbsp;TEXT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recv&nbsp;failed.&nbsp;Error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;szErrorMsg,&nbsp;szWndName,&nbsp;MB_OK);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf_s(szMsg,&nbsp;</span><span style="color: #000000; ">256</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">client&nbsp;closed.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;textHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOutA(hdc,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;row,&nbsp;szMsg,&nbsp;strlen(szMsg));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;textHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOutA(hdc,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;row,&nbsp;szMsg,&nbsp;strlen(szMsg));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;textHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;FD_WRITE:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;FD_CLOSE:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(wParam);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;DefWindowProc(hwnd,&nbsp;uMsg,&nbsp;wParam,&nbsp;lParam);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;TRUE;<br />}</span></div></div><img src ="http://www.cppblog.com/cctoqh/aggbug/155342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">上善若静水</a> 2011-09-08 12:01 <a href="http://www.cppblog.com/cctoqh/archive/2011/09/08/155342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows网络编程：Complete Routine的基本使用</title><link>http://www.cppblog.com/cctoqh/archive/2011/09/08/155341.html</link><dc:creator>上善若静水</dc:creator><author>上善若静水</author><pubDate>Thu, 08 Sep 2011 03:58:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2011/09/08/155341.html</guid><wfw:comment>http://www.cppblog.com/cctoqh/comments/155341.html</wfw:comment><comments>http://www.cppblog.com/cctoqh/archive/2011/09/08/155341.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cctoqh/comments/commentRss/155341.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cctoqh/services/trackbacks/155341.html</trackback:ping><description><![CDATA[<div>Complete Routine的基本使用，下面是一个简单的例子<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">winsock2.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br />#pragma&nbsp;comment(lib,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ws2_32.lib</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;LISTEN_PORT&nbsp;5080</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;BUFF_SIZE&nbsp;&nbsp;&nbsp;256</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CALLBACK&nbsp;WorkerRoutine(DWORD&nbsp;error,&nbsp;DWORD&nbsp;bytes_transferred,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPWSAOVERLAPPED&nbsp;overlapped,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;inflags);<br /><br />typedef&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WSAOVERLAPPED&nbsp;overlapped;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recv_bytes;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inflags;<br />&nbsp;&nbsp;&nbsp;&nbsp;WSABUF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff;<br />}SOCKINFO;<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;wsaData;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nRet;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;listen_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN&nbsp;listen_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;client_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN&nbsp;client_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;client_addr_len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(client_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;buff[BUFF_SIZE];<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;recv_bytes&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;index;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKINFO&nbsp;sockInfo;<br />&nbsp;&nbsp;&nbsp;&nbsp;WSAEVENT&nbsp;wsaEvent;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAStartup(MAKEWORD(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wsaData);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAStartup()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;listen_sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;IPPROTO_TCP);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(INVALID_SOCKET&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;listen_sock)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">socket()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;retflag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_family&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htonl(INADDR_ANY);<br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_port&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htons(LISTEN_PORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bind(listen_sock,&nbsp;(SOCKADDR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">listen_addr,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(listen_addr));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(nRet&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bind()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;retflag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;listen(listen_sock,&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;nRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;retflag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;client_sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;accept(listen_sock,&nbsp;(SOCKADDR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client_addr,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client_addr_len);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(INVALID_SOCKET&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;client_sock)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;retflag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sockInfo.inflags&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sockInfo.overlapped,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(sockInfo.overlapped));<br />&nbsp;&nbsp;&nbsp;&nbsp;sockInfo.client_sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;client_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;sockInfo.buff.buf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;sockInfo.buff.len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;BUFF_SIZE;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sockInfo.overlapped.hEvent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(HANDLE)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sockInfo;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSARecv(client_sock,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sockInfo.buff,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sockInfo.recv_bytes,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sockInfo.inflags,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sockInfo.overlapped,&nbsp;WorkerRoutine)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSAGetLastError()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;WSA_IO_PENDING)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSARecv()&nbsp;WSA_IO_PENDING.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSARecv&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(client_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;retflag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;wsaEvent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSACreateEvent();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSA_INVALID_EVENT&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;wsaEvent)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSACreateEvent()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(client_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;retflag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAWaitForMultipleEvents(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wsaEvent,&nbsp;FALSE,&nbsp;WSA_INFINITE,&nbsp;TRUE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(index&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WAIT_IO_COMPLETION)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAWaitForMultipleEvents()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(client_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACloseEvent(wsaEvent);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;retflag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;closesocket(client_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;WSACloseEvent(wsaEvent);<br /><br />retflag1:<br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSACleanup()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CALLBACK&nbsp;WorkerRoutine(DWORD&nbsp;error,&nbsp;DWORD&nbsp;bytes_transferred,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPWSAOVERLAPPED&nbsp;overlapped,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;inflags)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKINFO</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;sockInfo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(error&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Callback&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;error);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(bytes_transferred&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">peer&nbsp;closed.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sockInfo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(SOCKINFO</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)overlapped</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">hEvent;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;sockInfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">buff.buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;sockInfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">inflags&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sockInfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">overlapped,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(sockInfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">overlapped));<br />&nbsp;&nbsp;&nbsp;&nbsp;sockInfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">overlapped.hEvent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(HANDLE)sockInfo;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSARecv(sockInfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">client_sock,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sockInfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">buff,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sockInfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">recv_bytes,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sockInfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">inflags,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sockInfo</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">overlapped,&nbsp;WorkerRoutine)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSAGetLastError()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;WSA_IO_PENDING)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSARecv()&nbsp;WSA_IO_PENDING.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSARecv&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</span></div></div><img src ="http://www.cppblog.com/cctoqh/aggbug/155341.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">上善若静水</a> 2011-09-08 11:58 <a href="http://www.cppblog.com/cctoqh/archive/2011/09/08/155341.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows网络编程：Overlapped Event的基本使用</title><link>http://www.cppblog.com/cctoqh/archive/2011/09/08/155339.html</link><dc:creator>上善若静水</dc:creator><author>上善若静水</author><pubDate>Thu, 08 Sep 2011 03:53:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2011/09/08/155339.html</guid><wfw:comment>http://www.cppblog.com/cctoqh/comments/155339.html</wfw:comment><comments>http://www.cppblog.com/cctoqh/archive/2011/09/08/155339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cctoqh/comments/commentRss/155339.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cctoqh/services/trackbacks/155339.html</trackback:ping><description><![CDATA[Windows网络编程Overlapped Event基本使用，下面是一个简单的例子<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">winsock2.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">windows.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br />#pragma&nbsp;comment(lib,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ws2_32.lib</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;LISTEN_PORT&nbsp;5080</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;BUFF_SIZE&nbsp;&nbsp;&nbsp;256</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;wsaData;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nRet;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;listen_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN&nbsp;listen_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;client_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN&nbsp;client_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;client_addr_len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(client_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;WSAEVENT&nbsp;read_event;<br />&nbsp;&nbsp;&nbsp;&nbsp;WSAOVERLAPPED&nbsp;client_overlapped;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;buff[BUFF_SIZE];<br />&nbsp;&nbsp;&nbsp;&nbsp;WSABUF&nbsp;wsaBuf;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;recv_bytes&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;flags&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;index;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAStartup(MAKEWORD(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wsaData);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAStartup()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;listen_sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket(PF_INET,&nbsp;SOCK_STREAM,&nbsp;IPPROTO_TCP);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(INVALID_SOCKET&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;listen_sock)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">socket()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;retflag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_family&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htonl(INADDR_ANY);<br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_port&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htons(LISTEN_PORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bind(listen_sock,&nbsp;(SOCKADDR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">listen_addr,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(listen_addr));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(nRet&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bind()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;retflag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;listen(listen_sock,&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;nRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;retflag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;client_sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;accept(listen_sock,&nbsp;(SOCKADDR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client_addr,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client_addr_len);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(INVALID_SOCKET&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;client_sock)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;retflag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;read_event&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSACreateEvent();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSA_INVALID_EVENT&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;read_event)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSACreateEvent()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(client_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;retflag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client_overlapped,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(client_overlapped));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client_overlapped.hEvent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;read_event;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsaBuf.buf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsaBuf.len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;BUFF_SIZE;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSARecv(client_sock,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wsaBuf,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">recv_bytes,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">flags,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client_overlapped,&nbsp;NULL)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSAGetLastError()&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;WSA_IO_PENDING)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSARecv&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSARecv&nbsp;WSA_IO_PENDING.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;wsaBuf.buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAWaitForMultipleEvents(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">read_event,&nbsp;FALSE,&nbsp;WSA_INFINITE,&nbsp;FALSE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">WSAResetEvent(read_event))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAResetEvent&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSAGetOverlappedResult(client_sock,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client_overlapped,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">recv_bytes,&nbsp;FALSE,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">flags);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(recv_bytes&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAGetOverlappedResult()&nbsp;socket&nbsp;close</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(client_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACloseEvent(read_event);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;wsaBuf.buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br /><br />retflag1:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSACleanup()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div><img src ="http://www.cppblog.com/cctoqh/aggbug/155339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">上善若静水</a> 2011-09-08 11:53 <a href="http://www.cppblog.com/cctoqh/archive/2011/09/08/155339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows网络编程：使用Completion Port</title><link>http://www.cppblog.com/cctoqh/archive/2011/09/07/155294.html</link><dc:creator>上善若静水</dc:creator><author>上善若静水</author><pubDate>Wed, 07 Sep 2011 09:39:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2011/09/07/155294.html</guid><wfw:comment>http://www.cppblog.com/cctoqh/comments/155294.html</wfw:comment><comments>http://www.cppblog.com/cctoqh/archive/2011/09/07/155294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cctoqh/comments/commentRss/155294.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cctoqh/services/trackbacks/155294.html</trackback:ping><description><![CDATA[下面是使用Completion Port的一个简单的例子：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">winsock2.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">windows.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br />#pragma&nbsp;comment(lib,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ws2_32.lib</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;LISTEN_PORT&nbsp;5080</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;DATA_BUFSIZE&nbsp;512</span><span style="color: #000000; "><br /><br />typedef&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "><br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WSAOVERLAPPED&nbsp;wsaOverlapped;<br />&nbsp;&nbsp;&nbsp;&nbsp;WSABUF&nbsp;wsaBuf;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;buffer[DATA_BUFSIZE];<br />}PER_IO_OPERATION_DATA,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">LPPER_IO_OPERATION_DATA;<br /><br />typedef&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "><br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;sock;<br />}PER_HANDLE_DATA,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">LPPER_HANDLE_DATA;<br /><br />DWORD&nbsp;WINAPI&nbsp;ServerWorkerThread(LPVOID&nbsp;lpCompletionPortID);<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;wsaData;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nRet;<br />&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hCompletionPort;<br />&nbsp;&nbsp;&nbsp;&nbsp;SYSTEM_INFO&nbsp;systemInfo;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hThread;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwThreadID;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;sockListen;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN&nbsp;listenAddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;acceptSock;<br />&nbsp;&nbsp;&nbsp;&nbsp;LPPER_HANDLE_DATA&nbsp;perHandleData;<br />&nbsp;&nbsp;&nbsp;&nbsp;LPPER_IO_OPERATION_DATA&nbsp;lpPerIoOperationData;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwFlags;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwBytesRecv;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAStartup(MAKEWORD(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wsaData);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(nRet&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAStartup()&nbsp;failed&nbsp;&nbsp;error:%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;nRet);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAStartup&nbsp;is&nbsp;OK!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">((hCompletionPort&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CreateIoCompletionPort(INVALID_HANDLE_VALUE,&nbsp;NULL,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">CreateIoCompletionPort()&nbsp;failed&nbsp;with&nbsp;error&nbsp;%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;GetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">CreateIoCompletionPort()&nbsp;is&nbsp;OK.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;GetSystemInfo(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">systemInfo);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)systemInfo.dwNumberOfProcessors</span><span style="color: #000000; ">*</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">((hThread&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CreateThread(NULL,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;ServerWorkerThread,&nbsp;hCompletionPort,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">dwThreadID))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">CreateThread()&nbsp;failed&nbsp;with&nbsp;error&nbsp;%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;GetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">CreateThread()&nbsp;is&nbsp;OK!&nbsp;Thread&nbsp;ID:%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;dwThreadID);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hThread);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">((sockListen&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSASocket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;NULL,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;WSA_FLAG_OVERLAPPED))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;INVALID_SOCKET)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSASocket()&nbsp;failed&nbsp;with&nbsp;error&nbsp;%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSASocket()&nbsp;is&nbsp;OK!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;listenAddr.sin_family&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;listenAddr.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htonl(INADDR_ANY);<br />&nbsp;&nbsp;&nbsp;&nbsp;listenAddr.sin_port&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htons(LISTEN_PORT);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(bind(sockListen,&nbsp;(SOCKADDR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">listenAddr,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(listenAddr))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bind()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(sockListen);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bind()is&nbsp;fine!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(listen(sockListen,&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(sockListen);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen()&nbsp;is&nbsp;OK!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(TRUE)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">((acceptSock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAAccept(sockListen,&nbsp;NULL,&nbsp;NULL,&nbsp;NULL,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAAccept()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAAccept()&nbsp;is&nbsp;OK!.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">((perHandleData&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(LPPER_HANDLE_DATA)GlobalAlloc(GPTR,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(PER_HANDLE_DATA)))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GlobalAlloc()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;GetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GlobalAlloc()&nbsp;for&nbsp;PER_HANDLE_DATA&nbsp;is&nbsp;OK!.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">socket&nbsp;%d&nbsp;create.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;acceptSock);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perHandleData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;acceptSock;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(CreateIoCompletionPort((HANDLE)acceptSock,&nbsp;hCompletionPort,&nbsp;(DWORD)perHandleData,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">CreateIoCompletionPort()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;GetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">CreateIoCompletionPort()&nbsp;is&nbsp;OK!.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">((lpPerIoOperationData&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(PER_IO_OPERATION_DATA)))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GlobalAlloc()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;GetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GlobalAlloc()&nbsp;for&nbsp;PER_IO_OPERATION_DATA&nbsp;is&nbsp;OK!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">(lpPerIoOperationData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">wsaOverlapped),&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(OVERLAPPED));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPerIoOperationData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">wsaBuf.len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;DATA_BUFSIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPerIoOperationData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">wsaBuf.buf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;lpPerIoOperationData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">buffer;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwFlags&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSARecv(acceptSock,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">(lpPerIoOperationData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">wsaBuf),&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">dwBytesRecv,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">dwFlags,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">(lpPerIoOperationData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">wsaOverlapped),&nbsp;NULL)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSAGetLastError()&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;ERROR_IO_PENDING)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSARecv()&nbsp;failed,&nbsp;error&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSARecv()&nbsp;is&nbsp;OK!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSACleanup()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSACleanup()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSACleanup()&nbsp;is&nbsp;OK!.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />DWORD&nbsp;WINAPI&nbsp;ServerWorkerThread(LPVOID&nbsp;lpCompletionPortID)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hCompletionPort&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(HANDLE)lpCompletionPortID;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwBytesTransferred&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;LPPER_HANDLE_DATA&nbsp;lpPerHandleData;<br />&nbsp;&nbsp;&nbsp;&nbsp;LPPER_IO_OPERATION_DATA&nbsp;lpPerIoData;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwFlags;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(TRUE)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(GetQueuedCompletionStatus(hCompletionPort,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">dwBytesTransferred,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(DWORD</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">lpPerHandleData,&nbsp;(LPOVERLAPPED</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">lpPerIoData,&nbsp;INFINITE)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GetQueuedCompletionStatus()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;GetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GetQueuedCompletionStatus()&nbsp;is&nbsp;OK!.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(dwBytesTransferred&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">closing&nbsp;socket&nbsp;%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;lpPerHandleData);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(closesocket(lpPerHandleData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">sock)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">closesocket()&nbsp;failed&nbsp;with&nbsp;error&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">closesocket()&nbsp;is&nbsp;fine!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalFree(lpPerHandleData);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalFree(lpPerIoData);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;lpPerIoData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">buffer);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">(lpPerIoData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">wsaOverlapped),&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(OVERLAPPED));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPerIoData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">wsaBuf.len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;DATA_BUFSIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPerIoData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">wsaBuf.buf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;lpPerIoData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">buffer;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwFlags&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSARecv(lpPerHandleData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">sock,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">(lpPerIoData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">wsaBuf),&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">dwBytesTransferred,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">dwFlags,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">(lpPerIoData</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">wsaOverlapped),&nbsp;NULL)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WSAGetLastError()&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;ERROR_IO_PENDING)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSARecv()&nbsp;failed,&nbsp;error&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSARecv()&nbsp;is&nbsp;OK!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div><img src ="http://www.cppblog.com/cctoqh/aggbug/155294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">上善若静水</a> 2011-09-07 17:39 <a href="http://www.cppblog.com/cctoqh/archive/2011/09/07/155294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows网络编程：WSAEventSelect的基本使用</title><link>http://www.cppblog.com/cctoqh/archive/2011/08/23/154149.html</link><dc:creator>上善若静水</dc:creator><author>上善若静水</author><pubDate>Tue, 23 Aug 2011 09:32:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2011/08/23/154149.html</guid><wfw:comment>http://www.cppblog.com/cctoqh/comments/154149.html</wfw:comment><comments>http://www.cppblog.com/cctoqh/archive/2011/08/23/154149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cctoqh/comments/commentRss/154149.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cctoqh/services/trackbacks/154149.html</trackback:ping><description><![CDATA[下面是使用<div style="display: inline-block; "></div><span class="Apple-style-span" style="font-size: 13px; background-color: #eeeeee; ">WSAEventSelect的一个简单的例子<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">winsock2.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br />#pragma&nbsp;comment(lib,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ws2_32.lib</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;LISTEN_PORT&nbsp;5080</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;BUFF_SIZE&nbsp;&nbsp;&nbsp;256</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;wsaData;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nRet;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;listen_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN&nbsp;listen_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;WSAEVENT&nbsp;startEvent;<br />&nbsp;&nbsp;&nbsp;&nbsp;WSAEVENT&nbsp;clientEvent;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;client_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;event_num&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;index;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN&nbsp;client_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;client_addr_len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(client_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;WSANETWORKEVENTS&nbsp;wsaNetworkEvents;<br />&nbsp;&nbsp;&nbsp;&nbsp;WSAEVENT&nbsp;event_array[WSA_MAXIMUM_WAIT_EVENTS];<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;sock_array[WSA_MAXIMUM_WAIT_EVENTS];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;buff[BUFF_SIZE];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;accept_num&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAStartup(MAKEWORD(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wsaData);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAStartup()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;listen_sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;IPPROTO_TCP);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(INVALID_SOCKET&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;listen_sock)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">socket()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_family&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htonl(INADDR_ANY);<br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_port&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htons(LISTEN_PORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bind(listen_sock,&nbsp;(SOCKADDR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">listen_addr,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(listen_addr));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(nRet&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bind()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;listen(listen_sock,&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;nRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;startEvent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSACreateEvent();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(startEvent&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;WSA_INVALID_EVENT)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSACreateEvent()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAEventSelect(listen_sock,&nbsp;startEvent,&nbsp;FD_ACCEPT</span><span style="color: #000000; ">|</span><span style="color: #000000; ">FD_CLOSE);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;nRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAEventSelect()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACloseEvent(startEvent);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;event_array[event_num]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;startEvent;<br />&nbsp;&nbsp;&nbsp;&nbsp;sock_array[event_num]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;listen_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">event_num;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAWaitForMultipleEvents(event_num,&nbsp;event_array,&nbsp;FALSE,&nbsp;WSA_INFINITE,&nbsp;FALSE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(index&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;WSA_WAIT_FAILED&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;index&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;WSA_WAIT_TIMEOUT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;</span><span style="color: #000000; ">-=</span><span style="color: #000000; ">&nbsp;WSA_WAIT_EVENT_0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAEnumNetworkEvents(sock_array[index],&nbsp;event_array[index],&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wsaNetworkEvents);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;nRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAEnumNetworkEvents()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(wsaNetworkEvents.lNetworkEvents&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;FD_ACCEPT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(wsaNetworkEvents.iErrorCode[FD_ACCEPT_BIT]&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">FD_ACCEPT&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;wsaNetworkEvents.iErrorCode[FD_ACCEPT_BIT]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(event_num&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;WSA_MAXIMUM_WAIT_EVENTS)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client_sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;accept(sock_array[index],&nbsp;(SOCKADDR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client_addr,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client_addr_len);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(INVALID_SOCKET&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;client_sock)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">in&nbsp;accept&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clientEvent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSACreateEvent();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(clientEvent&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;WSA_INVALID_EVENT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">in&nbsp;WSACreateEvent()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(client_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAEventSelect(client_sock,&nbsp;clientEvent,&nbsp;FD_READ</span><span style="color: #000000; ">|</span><span style="color: #000000; ">FD_WRITE</span><span style="color: #000000; ">|</span><span style="color: #000000; ">FD_CLOSE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;nRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">in&nbsp;WSAEventSelect()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(client_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event_array[event_num]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;clientEvent;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock_array[event_num]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;client_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">event_num;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">accept_num;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(wsaNetworkEvents.lNetworkEvents&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;FD_READ)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(wsaNetworkEvents.iErrorCode[FD_READ_BIT]&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">FD_READ&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;wsaNetworkEvents.iErrorCode[FD_READ_BIT]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recv(sock_array[index],&nbsp;buff,&nbsp;BUFF_SIZE,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(nRet&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SOCKET_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recv()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(nRet&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recv()&nbsp;0.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\t%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;buff);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(wsaNetworkEvents.lNetworkEvents&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;FD_WRITE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(wsaNetworkEvents.iErrorCode[FD_WRITE_BIT]&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">FD_WRITE&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;wsaNetworkEvents.iErrorCode[FD_WRITE_BIT]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">FD_WRITE&nbsp;do.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(wsaNetworkEvents.lNetworkEvents&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;FD_CLOSE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(wsaNetworkEvents.iErrorCode[FD_CLOSE_BIT]&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">FD_CLOSE&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;wsaNetworkEvents.iErrorCode[FD_CLOSE_BIT]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\nFD_CLOSE!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(sock_array[index]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACloseEvent(event_array[index]);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(index</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;event_num)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock_array[index]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sock_array[index</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event_array[index]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;event_array[index</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">index;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">event_num;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(event_num&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;accept_num)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(event_num&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(sock_array[event_num]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACloseEvent(event_array[event_num]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">event_num;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />rettag1:<br />&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSACleanup()&nbsp;failed,&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}<br /></span></div><br /></span><img src ="http://www.cppblog.com/cctoqh/aggbug/154149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">上善若静水</a> 2011-08-23 17:32 <a href="http://www.cppblog.com/cctoqh/archive/2011/08/23/154149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows网络编程：select的基本使用</title><link>http://www.cppblog.com/cctoqh/archive/2011/08/19/153869.html</link><dc:creator>上善若静水</dc:creator><author>上善若静水</author><pubDate>Fri, 19 Aug 2011 09:16:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2011/08/19/153869.html</guid><wfw:comment>http://www.cppblog.com/cctoqh/comments/153869.html</wfw:comment><comments>http://www.cppblog.com/cctoqh/archive/2011/08/19/153869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cctoqh/comments/commentRss/153869.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cctoqh/services/trackbacks/153869.html</trackback:ping><description><![CDATA[<div><p style="margin-left:18.0pt;text-indent:0cm;"><span class="Apple-style-span" style="font-size: 13px; background-color: #eeeeee; ">client_sock</span><span style="font-family:宋体;">select的基本使用<br />函数原型：</span></p>  <p style="margin-left:18.0pt"></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;select(<br />&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nfds,<br />&nbsp;__inout&nbsp;&nbsp;fd_set&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">readfds,<br />&nbsp;__inout&nbsp;&nbsp;fd_set&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">writefds,<br />&nbsp;__inout&nbsp;&nbsp;fd_set&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">exceptfds,<br />&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;timeval&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">timeout<br />);</span></div><p>&nbsp;</p>  <p style="margin-left:18.0pt"><span style="font-family: 宋体;">参数说明：</span></p>  <p style="margin-left:18.0pt">nfds: <span style="font-family:宋体;">与</span><span><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;; color:black">Berkeley</span></span>&nbsp;<span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black">套接字兼容，没有什么作用，忽略<br /></span><span><span style="font-size:10.0pt; font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black">readfds: </span></span><span><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;; color:black">检查设置的套接字是否可以读，可以忽略</span></span></p>  <p><span>&nbsp; &nbsp; &nbsp;writefds</span><span style="font-family: 宋体;">：</span><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black">检查设置的套接字是否可以写，可以忽略</span></p>  <p><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>exc<span><span style="font-size:10.0pt; font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black">eptfds: </span></span><span><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;; color:black">检查套接字的错</span></span><span><span style="font-size:10.0pt; font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black">timeout</span></span><span><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;; color:black">：</span></span><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black">select</span><span><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;; color:black">等待的时间。</span></span><span><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;; color:black">NULL:</span></span><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black">阻塞状态；初始为</span><span><span style="font-size:10.0pt; font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black">{0,0}</span></span><span><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;; color:black">时，立即返回</span></span></p>  <p><font class="Apple-style-span" face="'Segoe UI', sans-serif" size="2"></font></p><div><font class="Apple-style-span" face="'Segoe UI', sans-serif" size="2"><span style="font-size: 10pt; color: black; ">&nbsp; &nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; font-family: 宋体; ">返回值：返回</span><span style="font-size: 10pt; font-family: 'Segoe UI', sans-serif; color: black; ">fd_set</span><span style="font-size: 10pt; font-family: 宋体; ">中的套接字句柄数；</span><span style="font-size: 10pt; font-family: 'Segoe UI', sans-serif; color: black; ">0</span><span style="font-size: 10pt; font-family: 宋体; ">：等待时间超时；</span> <span style="font-size: 10.5pt; font-family: Calibri, sans-serif; ">SOCKET_ERROR</span><span style="font-size: 10pt; font-family: 宋体; ">发生错误，使用</span><span style="font-size: 10pt; ">WSAGetLastError</span><span style="font-size: 10pt; font-family: 宋体; ">获</span><span style="font-size: 10.5pt; font-family: 宋体; ">得具体的错误代码。</span></span></font></div><p>&nbsp;</p>  <p><span><span style="font-size:10.0pt; font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black">操作</span></span><span>fd_set</span><span style="font-family:宋体;">的宏:</span></p>  <p align="left" style="text-align:left;"><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">FD_CLR(</span></strong><em><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">s</span></em><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">,</span></strong>&nbsp;<span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">*</span><em><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">set</span></em><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">)</span></strong></p>  <p style="margin-left:18.0pt;text-indent:20.0pt"><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black;">从</span><span style="font-size:10.0pt; font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">set</span><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black;">中移除</span></p>  <p align="left" style="text-align:left;"><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">FD_ISSET(</span></strong><em><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">s</span></em><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">,</span></strong>&nbsp;<span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">*</span><em><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">set</span></em><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">)</span></strong></p>  <p align="left" style="text-align:left;text-indent:37.8pt;"><span style="font-family:宋体;">如果</span><em><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">s</span></em><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black;">是</span><em><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">set</span></em><em><span style="font-size: 10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black;">的成员</span></em><span style="font-size:10.0pt;font-family: 宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black;">返回非</span><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">0</span><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black;">，否则返回</span><span style="font-size:10.0pt; font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">0</span></p>  <p align="left" style="text-align:left;"><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">FD_SET(</span></strong><em><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">s</span></em><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">,</span></strong>&nbsp;<span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">*</span><em><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">set</span></em><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">)</span></strong></p>  <p align="left" style="text-align:left;text-indent:36.0pt;"><span style="font-size: 10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black;">把</span><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">&nbsp;<em>s</em></span><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black;">添加到</span><em><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">set</span></em><span style="font-size:10.0pt; font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black;">中</span></p>  <p align="left" style="text-align:left;"><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">FD_ZERO(</span></strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">*</span><em><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">set</span></em><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">)</span></strong></p>  <p align="left" style="margin-left:36.0pt;text-align:left;"><span style="font-size:10.0pt;font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black;">初始化</span><em><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">set</span></em><span style="font-size:10.0pt; font-family:宋体;Segoe UI&quot;;Segoe UI&quot;;Segoe UI&quot;;color:black;">为</span><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:black;">null</span></strong></p>  <p><br /></p>  <p><span style="font-family:宋体;">使用</span>select<span style="font-family:宋体;">使用的几个步骤</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span>1.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;">使用</span>FD_ZERO<span style="font-family:宋体;">对</span>fd_set<span style="font-family:宋体;">结构清空</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span>2.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;">添加套接字句柄到</span>fd_set<span style="font-family:宋体;">中，使用</span>FD_SET<span style="font-family:宋体;">宏</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span>3.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;">调用</span>select</p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span>4.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;">使用</span>FD_ISSET<span style="font-family:宋体;">判断是哪个套接字</span></p>  <p style="margin-left: 18pt; text-indent: -18pt; "><span><span>5.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;">进行读写操作，然后返回步骤</span>1<br /><br />下面是一个简单例子<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp; &nbsp; &nbsp;#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">winsock2.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br />#pragma&nbsp;comment(lib,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ws2_32.lib</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;LISTEN_PORT&nbsp;5080</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;RECV_BUFF_SIZE&nbsp;&nbsp;&nbsp;512</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;wsadata;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ret;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;listen_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;client_sock;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN&nbsp;listen_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN&nbsp;in_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;in_add_len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(in_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;fd_set&nbsp;fdread;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;recv_buff[RECV_BUFF_SIZE];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSAStartup(MAKEWORD(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wsadata);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSAStartup&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;listen_sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;IPPROTO_TCP);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(INVALID_SOCKET&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;listen_sock)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">socket&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_family&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htonl(INADDR_ANY);<br />&nbsp;&nbsp;&nbsp;&nbsp;listen_addr.sin_port&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htons(LISTEN_PORT);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bind(listen_sock,&nbsp;(SOCKADDR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">listen_addr,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(listen_addr));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bind&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;listen(listen_sock,&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;client_sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;accept(listen_sock,&nbsp;(SOCKADDR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">in_addr,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">in_add_len);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(INVALID_SOCKET&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;client_sock)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">goto</span><span style="color: #000000; ">&nbsp;rettag2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept&nbsp;client:%s:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;inet_ntoa(in_addr.sin_addr),&nbsp;in_addr.sin_port);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FD_ZERO(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">fdread);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FD_SET(client_sock,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">fdread);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;select(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">fdread,&nbsp;NULL,&nbsp;NULL,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">select&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(ret&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(FD_ISSET(client_sock,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">fdread))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recv(client_sock,&nbsp;recv_buff,&nbsp;RECV_BUFF_SIZE,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recv&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recv,&nbsp;socket&nbsp;closed.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">receive&nbsp;data:\n%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;recv_buff);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp; &nbsp;&nbsp;<br />&nbsp; &nbsp; closesocket(<div style="display: inline-block; "></div></span>client_sock<span style="color: #000000; ">);<br />rettag2:<br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;closesocket(listen_sock);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(SOCKET_ERROR&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">closesocket&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />rettag1:<br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WSACleanup&nbsp;error:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div><p>&nbsp;</p></div><img src ="http://www.cppblog.com/cctoqh/aggbug/153869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">上善若静水</a> 2011-08-19 17:16 <a href="http://www.cppblog.com/cctoqh/archive/2011/08/19/153869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QT中封装的IP地址的widget</title><link>http://www.cppblog.com/cctoqh/archive/2011/06/03/148018.html</link><dc:creator>上善若静水</dc:creator><author>上善若静水</author><pubDate>Fri, 03 Jun 2011 07:44:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2011/06/03/148018.html</guid><wfw:comment>http://www.cppblog.com/cctoqh/comments/148018.html</wfw:comment><comments>http://www.cppblog.com/cctoqh/archive/2011/06/03/148018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cctoqh/comments/commentRss/148018.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cctoqh/services/trackbacks/148018.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: QT没有提供一个完整的IP地址控件，1. 可以使用QLineEdit简单的实现Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp; &nbsp; QRegExp&nbsp;regExp("((2[0-4]\\d|25[0-5]|[01]?\\d...&nbsp;&nbsp;<a href='http://www.cppblog.com/cctoqh/archive/2011/06/03/148018.html'>阅读全文</a><img src ="http://www.cppblog.com/cctoqh/aggbug/148018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">上善若静水</a> 2011-06-03 15:44 <a href="http://www.cppblog.com/cctoqh/archive/2011/06/03/148018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACE使用日志回调机制定制日志格式</title><link>http://www.cppblog.com/cctoqh/archive/2011/02/17/140212.html</link><dc:creator>上善若静水</dc:creator><author>上善若静水</author><pubDate>Thu, 17 Feb 2011 05:01:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2011/02/17/140212.html</guid><wfw:comment>http://www.cppblog.com/cctoqh/comments/140212.html</wfw:comment><comments>http://www.cppblog.com/cctoqh/archive/2011/02/17/140212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cctoqh/comments/commentRss/140212.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cctoqh/services/trackbacks/140212.html</trackback:ping><description><![CDATA[
<p class="MsoNormal" style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; "><span lang="EN-US">ACE</span><span style="font-family: 宋体; ">使用日志回调机制定制日志格式</span></p><p class="MsoNormal" style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; "><span lang="EN-US">ACE</span><span style="font-family: 宋体; ">日志提供</span><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; color: rgb(1, 0, 1); ">ACE_Log_Msg</span><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; ">::<span style="color: rgb(1, 0, 1); ">MSG_CALLBACK</span></span><span style="font-size: 9pt; font-family: 新宋体; color: rgb(1, 0, 1); ">标志，启用此标志后，输出日志的之前会调用我们自己定制的函数，对消息数据可以进行进一步处理。<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; "><span style="font-size: 9pt; font-family: 新宋体; color: rgb(1, 0, 1); ">实现<span lang="EN-US">CALLBACK</span>函数<span lang="EN-US">,</span>需要写一个日志类<span lang="EN-US">,</span>派生自<span lang="EN-US">ACE_Log_Msg_Callback</span>类<span lang="EN-US">,</span>然后重写里面的<span lang="EN-US">log</span>虚函数<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" align="left" style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; text-align: left; "><font color="#0000FF" face="新宋体"><span style="font-size: 12px; "></span></font></p><div style="padding-right: 5px; padding-left: 4px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); padding-bottom: 4px; border-left-color: rgb(204, 204, 204); padding-top: 4px; font-size: 13px; width: 751px; word-break: break-all; "><font color="#0000FF" face="新宋体"><span style="color: rgb(0, 0, 255); ">class</span><span style="color: rgb(0, 0, 0); ">&nbsp;Logger&nbsp;:&nbsp;</span><span style="color: rgb(0, 0, 255); ">public</span><span style="color: rgb(0, 0, 0); ">&nbsp;ACE_Log_Msg_Callback<br>{<br></span><span style="color: rgb(0, 0, 255); ">public</span><span style="color: rgb(0, 0, 0); ">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">virtual</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 255); ">void</span><span style="color: rgb(0, 0, 0); ">&nbsp;log(ACE_Log_Record&nbsp;</span><span style="color: rgb(0, 0, 0); ">&amp;</span><span style="color: rgb(0, 0, 0); ">log_record);<br>};</span></font></div><font color="#0000FF" face="新宋体"><br></font><p style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; "></p><p class="MsoNormal" style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; "><span style="font-size: 9pt; font-family: 新宋体; ">在日志输出之前，会通过调用我们重写的<span lang="EN-US">log</span>函数。源码如下：<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" align="left" style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; text-align: left; "><font color="#010001" face="新宋体"><span style="font-size: 12px; "></span></font></p><div style="padding-right: 5px; padding-left: 4px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); padding-bottom: 4px; border-left-color: rgb(204, 204, 204); padding-top: 4px; font-size: 13px; width: 751px; word-break: break-all; "><font color="#010001" face="新宋体"><span style="color: rgb(0, 0, 0); ">ssize_t<br>ACE_Log_Msg::log&nbsp;(ACE_Log_Record&nbsp;</span><span style="color: rgb(0, 0, 0); ">&amp;</span><span style="color: rgb(0, 0, 0); ">log_record,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;suppress_stderr)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;&#8230;</span><span style="color: rgb(0, 128, 0); "><br></span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">if</span><span style="color: rgb(0, 0, 0); ">&nbsp;(ACE_BIT_ENABLED&nbsp;(ACE_Log_Msg::flags_,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_Log_Msg::MSG_CALLBACK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0); ">&amp;&amp;</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 255); ">this</span><span style="color: rgb(0, 0, 0); ">-&gt;</span><span style="color: rgb(0, 0, 0); ">msg_callback&nbsp;()&nbsp;</span><span style="color: rgb(0, 0, 0); ">!=</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">this</span><span style="color: rgb(0, 0, 0); ">-&gt;</span><span style="color: rgb(0, 0, 0); ">msg_callback&nbsp;()</span><span style="color: rgb(0, 0, 0); ">-&gt;</span><span style="color: rgb(0, 0, 0); ">log&nbsp;(log_record);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;&#8230;</span><span style="color: rgb(0, 128, 0); "><br></span><span style="color: rgb(0, 0, 0); ">}</span></font></div><font color="#010001" face="新宋体"><br></font><p style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; "></p><p class="MsoNormal" style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; "><span style="font-size: 9pt; font-family: 新宋体; ">通过上面知道执行日志回调函数的两个条件：<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoListParagraph" style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 36pt; padding-top: 6px; text-indent: -18pt; "><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; "><span>1.<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 9pt; font-family: 新宋体; ">启用<span lang="EN-US" style="color: rgb(1, 0, 1); ">ACE_Log_Msg</span><span lang="EN-US">::<span style="color: rgb(1, 0, 1); ">MSG_CALLBACK<span>&nbsp;</span><o:p></o:p></span></span></span></p><p class="MsoListParagraph" style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 36pt; padding-top: 6px; text-indent: -18pt; "><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; "><span>2.<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 9pt; font-family: 新宋体; ">设置我们<span lang="EN-US">Logger</span>对象的指针<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; "><span style="font-size: 9pt; font-family: 新宋体; ">调用时会传给我们一个<span lang="EN-US">ACE_Log_Record</span>引用的对象，这个对象包含输出日志的信息，因此在<span lang="EN-US">log</span>函数内部们就可以对日志定制化。注意在在<span lang="EN-US">log</span>函数内部使用<span lang="EN-US">ACE_DEBUG</span>等会产生无限递归调用。<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; "><span style="font-size: 9pt; font-family: 新宋体; ">示例代码：<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" align="left" style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; text-align: left; "><font color="#0000FF" face="新宋体"><span style="font-size: 12px; "></span></font></p><div style="padding-right: 5px; padding-left: 4px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); padding-bottom: 4px; border-left-color: rgb(204, 204, 204); padding-top: 4px; font-size: 13px; width: 751px; word-break: break-all; "><font color="#0000FF" face="新宋体"><span style="color: rgb(0, 0, 0); ">#include&nbsp;</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">ace/Log_Msg.h</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); "><br>#include&nbsp;</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">ace/Log_Msg_Callback.h</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); "><br>#include&nbsp;</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">ace/Log_Record.h</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); "><br>#include&nbsp;</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">ace/OS_NS_stdio.h</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); "><br>#include&nbsp;</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">ace/os.h</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); "><br>&nbsp;<br></span><span style="color: rgb(0, 0, 255); ">class</span><span style="color: rgb(0, 0, 0); ">&nbsp;Logger&nbsp;:&nbsp;</span><span style="color: rgb(0, 0, 255); ">public</span><span style="color: rgb(0, 0, 0); ">&nbsp;ACE_Log_Msg_Callback<br>{<br></span><span style="color: rgb(0, 0, 255); ">public</span><span style="color: rgb(0, 0, 0); ">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">virtual</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 255); ">void</span><span style="color: rgb(0, 0, 0); ">&nbsp;log(ACE_Log_Record&nbsp;</span><span style="color: rgb(0, 0, 0); ">&amp;</span><span style="color: rgb(0, 0, 0); ">log_record);<br>};<br>&nbsp;<br></span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;format_time(</span><span style="color: rgb(0, 0, 255); ">const</span><span style="color: rgb(0, 0, 0); ">&nbsp;ACE_Time_Value</span><span style="color: rgb(0, 0, 0); ">&amp;</span><span style="color: rgb(0, 0, 0); ">&nbsp;time_tv,&nbsp;ACE_TCHAR</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">&nbsp;outbuf,&nbsp;size_t&nbsp;bufsize)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">if</span><span style="color: rgb(0, 0, 0); ">&nbsp;(bufsize&nbsp;</span><span style="color: rgb(0, 0, 0); ">==</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">return</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;time_tt&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;time_tv.sec();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">struct</span><span style="color: rgb(0, 0, 0); ">&nbsp;tm</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">&nbsp;time_tm&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;ACE_OS::localtime(</span><span style="color: rgb(0, 0, 0); ">&amp;</span><span style="color: rgb(0, 0, 0); ">time_tt);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;length&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;ACE_OS::snprintf(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outbuf,&nbsp;bufsize&nbsp;</span><span style="color: rgb(0, 0, 0); ">-</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">1</span><span style="color: rgb(0, 0, 0); ">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">%04d-%02d-%02d&nbsp;%02d:%02d:%02d.%03d</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_tm</span><span style="color: rgb(0, 0, 0); ">-&gt;</span><span style="color: rgb(0, 0, 0); ">tm_year</span><span style="color: rgb(0, 0, 0); ">+</span><span style="color: rgb(0, 0, 0); ">1900</span><span style="color: rgb(0, 0, 0); ">,&nbsp;time_tm</span><span style="color: rgb(0, 0, 0); ">-&gt;</span><span style="color: rgb(0, 0, 0); ">tm_mon</span><span style="color: rgb(0, 0, 0); ">+</span><span style="color: rgb(0, 0, 0); ">1</span><span style="color: rgb(0, 0, 0); ">,&nbsp;time_tm</span><span style="color: rgb(0, 0, 0); ">-&gt;</span><span style="color: rgb(0, 0, 0); ">tm_mday,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_tm</span><span style="color: rgb(0, 0, 0); ">-&gt;</span><span style="color: rgb(0, 0, 0); ">tm_hour,&nbsp;time_tm</span><span style="color: rgb(0, 0, 0); ">-&gt;</span><span style="color: rgb(0, 0, 0); ">tm_min,&nbsp;time_tm</span><span style="color: rgb(0, 0, 0); ">-&gt;</span><span style="color: rgb(0, 0, 0); ">tm_sec,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_tv.usec()</span><span style="color: rgb(0, 0, 0); ">/</span><span style="color: rgb(0, 0, 0); ">1000</span><span style="color: rgb(0, 0, 0); ">);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">return</span><span style="color: rgb(0, 0, 0); ">&nbsp;length;<br>}<br>&nbsp;<br></span><span style="color: rgb(0, 0, 255); ">void</span><span style="color: rgb(0, 0, 0); "><br>Logger::log(ACE_Log_Record&nbsp;</span><span style="color: rgb(0, 0, 0); ">&amp;</span><span style="color: rgb(0, 0, 0); ">log_record)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TCHAR&nbsp;time_str[</span><span style="color: rgb(0, 0, 0); ">32</span><span style="color: rgb(0, 0, 0); ">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;获取时间格式</span><span style="color: rgb(0, 128, 0); "><br></span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_Time_Value&nbsp;now&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;ACE_OS::gettimeofday();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;format_time(now,&nbsp;time_str,&nbsp;</span><span style="color: rgb(0, 0, 0); ">32</span><span style="color: rgb(0, 0, 0); ">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;获取日志等级名称</span><span style="color: rgb(0, 128, 0); "><br></span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u_long&nbsp;priority&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;log_record.priority();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">const</span><span style="color: rgb(0, 0, 0); ">&nbsp;ACE_TCHAR&nbsp;</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">priority_name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;log_record.priority_name(ACE_Log_Priority(log_record.type()));<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;data_length&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;log_record.msg_data_len();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data_length&nbsp;</span><span style="color: rgb(0, 0, 0); ">+=</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">4</span><span style="color: rgb(0, 0, 0); ">;&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;[]&nbsp;[]</span><span style="color: rgb(0, 128, 0); "><br></span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data_length&nbsp;</span><span style="color: rgb(0, 0, 0); ">+=</span><span style="color: rgb(0, 0, 0); ">&nbsp;ACE_OS::strlen(time_str);&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;[time]</span><span style="color: rgb(0, 128, 0); "><br></span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data_length&nbsp;</span><span style="color: rgb(0, 0, 0); ">+=</span><span style="color: rgb(0, 0, 0); ">&nbsp;ACE_OS::strlen(priority_name);&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;[priority&nbsp;name]</span><span style="color: rgb(0, 128, 0); "><br></span><span style="color: rgb(0, 0, 0); ">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TCHAR</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">&nbsp;new_format_msg;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_NEW(new_format_msg,&nbsp;ACE_TCHAR[data_length</span><span style="color: rgb(0, 0, 0); ">+</span><span style="color: rgb(0, 0, 0); ">1</span><span style="color: rgb(0, 0, 0); ">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">const</span><span style="color: rgb(0, 0, 0); ">&nbsp;ACE_TCHAR&nbsp;</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">old_data&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;log_record.msg_data();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_OS::snprintf(new_format_msg,&nbsp;data_length</span><span style="color: rgb(0, 0, 0); ">+</span><span style="color: rgb(0, 0, 0); ">1</span><span style="color: rgb(0, 0, 0); ">,&nbsp;</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">[%s][%s]%s</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_str,&nbsp;priority_name,&nbsp;old_data);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log_record.msg_data(new_format_msg);<br>}<br>&nbsp;<br></span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;ACE_TMAIN(</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">,&nbsp;ACE_TCHAR&nbsp;</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_LOG_MSG</span><span style="color: rgb(0, 0, 0); ">-&gt;</span><span style="color: rgb(0, 0, 0); ">set_flags(ACE_Log_Msg::MSG_CALLBACK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger&nbsp;logger;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_LOG_MSG</span><span style="color: rgb(0, 0, 0); ">-&gt;</span><span style="color: rgb(0, 0, 0); ">msg_callback(</span><span style="color: rgb(0, 0, 0); ">&amp;</span><span style="color: rgb(0, 0, 0); ">logger);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG((LM_DEBUG,&nbsp;</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">(%t)&nbsp;show&nbsp;message!\n</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">return</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;<br>}</span></font></div><font color="#0000FF" face="新宋体"><br></font><p style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; "></p><p style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; ">&nbsp;</p>
<img src ="http://www.cppblog.com/cctoqh/aggbug/140212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">上善若静水</a> 2011-02-17 13:01 <a href="http://www.cppblog.com/cctoqh/archive/2011/02/17/140212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于函数 itoa() 使用中的问题</title><link>http://www.cppblog.com/cctoqh/archive/2006/09/25/12932.html</link><dc:creator>上善若静水</dc:creator><author>上善若静水</author><pubDate>Mon, 25 Sep 2006 01:45:00 GMT</pubDate><guid>http://www.cppblog.com/cctoqh/archive/2006/09/25/12932.html</guid><wfw:comment>http://www.cppblog.com/cctoqh/comments/12932.html</wfw:comment><comments>http://www.cppblog.com/cctoqh/archive/2006/09/25/12932.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/cctoqh/comments/commentRss/12932.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cctoqh/services/trackbacks/12932.html</trackback:ping><description><![CDATA[
		<font color="#a52a2a">   #include &lt;stdlib.h&gt;<br />   #include &lt;iostream.h&gt;<br />   void main()<br />   {<br />      int num = 123;<br />      const unsigned int NO = 5;</font>  <font color="#006400">// 如果将这两条语句改为 char *cNum = "   ";在执行程序时候将会产生<br /></font><font color="#a52a2a">      char cNum[NO];</font>               <font color="#006400">  // 严重的错误而终止.<br /></font><font color="#a52a2a">      itoa(num, cNum, 10);<br />      cout&lt;&lt;cNum&lt;&lt;endl;<br />   }</font><br /><br /><br />   <font color="#0000ff">   使用  const unsigned int NO = 5; char cNum[NO];    NO 的大小可以随意改.为什么?  为什么不可用指针类型的参数传给itoa() 的第二个参数?</font><img src ="http://www.cppblog.com/cctoqh/aggbug/12932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cctoqh/" target="_blank">上善若静水</a> 2006-09-25 09:45 <a href="http://www.cppblog.com/cctoqh/archive/2006/09/25/12932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>