学的比较匆忙,有错误请指出

  1. //user define
  2. #include <WinSock2.h>
  3. #include <stdio.h>
  4. #pragma comment(lib,"ws2_32.lib")
  5. #define BTN_1 0x01
  6. #define WM_SOCKET WM_USER+1
  7. #ifndef DEBUG_DISABLE
  8. #define DEBUG_ENTERED(M) MessageBox(NULL,\
  9. M,\
  10. "Tip",\
  11. MB_OK);
  12. #else
  13. #define DEBUG_ENTERED(M)
  14. #endif
  15. // 全局变量:
  16. HINSTANCE hInst; // 当前实例
  17. TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
  18. TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
  19. SOCKET sListen;
  20. FD_SET fdset;
  21. char writeBuf[100];
  22. HWND hWin;
  23. // 此代码模块中包含的函数的前向声明:
  24. ATOM MyRegisterClass(HINSTANCE hInstance);
  25. BOOL InitInstance(HINSTANCE, int);
  26. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  27. LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  28. //初始化窗体
  29. void CreateChildWindow(HWND hParent)
  30. {
  31. RECT rect;
  32. GetWindowRect(hParent,&rect);
  33. HWND hBtn1=CreateWindow("BUTTON",
  34. "Listen",
  35. WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
  36. (rect.right-rect.left)/2,
  37. (rect.bottom-rect.top)/2,
  38. 70,25,
  39. hParent,
  40. (HMENU)BTN_1,
  41. hInst,
  42. 0);
  43. }
  44. bool InitialSocket(SOCKET sock,u_short port,HWND hWnd)
  45. {
  46. SOCKADDR_IN serverAddr;
  47. serverAddr.sin_family=AF_INET;
  48. serverAddr.sin_port=htons(port);
  49. serverAddr.sin_addr.s_addr=htonl(ADDR_ANY);
  50. char buf[200];
  51. if(bind(sock,PSOCKADDR(&serverAddr),sizeof(serverAddr)))
  52. {
  53. sprintf(buf,"bind error!error code:%d",WSAGetLastError());
  54. DEBUG_ENTERED(buf)
  55. WSACleanup();
  56. return false;
  57. }
  58. WSAAsyncSelect(sListen,hWnd,WM_SOCKET,FD_READ|FD_ACCEPT|FD_CLOSE);
  59. return true;
  60. }
  61. void OnLsBtnClicked()
  62. {
  63. char buf[200];
  64. if(listen(sListen,5))
  65. {
  66. sprintf(buf,"listen error!error code:%d\n",WSAGetLastError());
  67. DEBUG_ENTERED(buf)
  68. WSACleanup();
  69. }
  70. else
  71. {
  72. sprintf(buf,"Now Listen");
  73. DEBUG_ENTERED(buf)
  74. }
  75. }
  76. void HandleSocket(WPARAM wParam,LPARAM lParam)
  77. {
  78. if(WSAGETSELECTERROR(lParam))
  79. {
  80. //有错误
  81. closesocket((SOCKET)wParam);
  82. return;
  83. }
  84. switch(WSAGETSELECTEVENT(lParam))
  85. {
  86. case FD_ACCEPT:
  87. {
  88. SOCKET newSocket=accept((SOCKET)wParam,NULL,NULL);
  89. if(newSocket==INVALID_SOCKET)
  90. {
  91. DEBUG_ENTERED("INVALID SOCKET!");
  92. return;
  93. }
  94. FD_SET(newSocket,&fdset);
  95. sprintf(writeBuf,"New connection!");
  96. UpdateWindow(hWin);
  97. }
  98. break;
  99. case FD_READ:
  100. recv((SOCKET)wParam,writeBuf,sizeof(writeBuf),0);
  101. //UpdateWindow(hWin);
  102. SendMessage(hWin,WM_PAINT,0,0);
  103. break;
  104. case FD_CLOSE:
  105. sprintf(writeBuf,"Connection closed!");
  106. UpdateWindow(hWin);
  107. break;
  108. }
  109. }
  110. //程序入口
  111. int APIENTRY _tWinMain(HINSTANCE hInstance,
  112. HINSTANCE hPrevInstance,
  113. LPTSTR lpCmdLine,
  114. int nCmdShow)
  115. {
  116. // TODO: 在此放置代码。
  117. MSG msg;
  118. HACCEL hAccelTable;
  119. // 初始化全局字符串
  120. LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  121. LoadString(hInstance, IDC_WSAASYNCSELECT, szWindowClass, MAX_LOADSTRING);
  122. FD_ZERO(&fdset);
  123. ZeroMemory(writeBuf,sizeof(writeBuf));
  124. MyRegisterClass(hInstance);
  125. // 执行应用程序初始化:
  126. if (!InitInstance (hInstance, nCmdShow))
  127. {
  128. return FALSE;
  129. }
  130. hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_WSAASYNCSELECT);
  131. // 主消息循环:
  132. while (GetMessage(&msg, NULL, 0, 0))
  133. {
  134. if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  135. {
  136. TranslateMessage(&msg);
  137. DispatchMessage(&msg);
  138. }
  139. }
  140. return (int) msg.wParam;
  141. }
  142. //
  143. // 函数: MyRegisterClass()
  144. //
  145. // 目的: 注册窗口类。
  146. //
  147. // 注释:
  148. //
  149. // 仅当希望在已添加到 Windows 95 的
  150. // “RegisterClassEx”函数之前此代码与 Win32 系统兼容时,
  151. // 才需要此函数及其用法。调用此函数
  152. // 十分重要,这样应用程序就可以获得关联的
  153. // “格式正确的”小图标。
  154. //
  155. ATOM MyRegisterClass(HINSTANCE hInstance)
  156. {
  157. WNDCLASSEX wcex;
  158. wcex.cbSize = sizeof(WNDCLASSEX);
  159. wcex.style = CS_HREDRAW | CS_VREDRAW;
  160. wcex.lpfnWndProc = (WNDPROC)WndProc;
  161. wcex.cbClsExtra = 0;
  162. wcex.cbWndExtra = 0;
  163. wcex.hInstance = hInstance;
  164. wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_WSAASYNCSELECT);
  165. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  166. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  167. wcex.lpszMenuName = (LPCTSTR)IDC_WSAASYNCSELECT;
  168. wcex.lpszClassName = szWindowClass;
  169. wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
  170. return RegisterClassEx(&wcex);
  171. }
  172. //
  173. // 函数: InitInstance(HANDLE, int)
  174. //
  175. // 目的: 保存实例句柄并创建主窗口
  176. //
  177. // 注释:
  178. //
  179. // 在此函数中,我们在全局变量中保存实例句柄并
  180. // 创建和显示主程序窗口。
  181. //
  182. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  183. {
  184. HWND hWnd;
  185. hInst = hInstance; // 将实例句柄存储在全局变量中
  186. hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  187. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  188. if (!hWnd)
  189. {
  190. return FALSE;
  191. }
  192. ShowWindow(hWnd, nCmdShow);
  193. UpdateWindow(hWnd);
  194. hWin=hWnd;
  195. //Socket初始化
  196. WSADATA wsaData;
  197. WSAStartup(MAKEWORD(2,2),&wsaData);
  198. sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  199. if(InitialSocket(sListen,25418,hWnd))
  200. {
  201. MessageBox(NULL,
  202. "Socket初始化成功",
  203. "Tip",
  204. MB_OK|MB_ICONINFORMATION);
  205. FD_SET(sListen,&fdset);
  206. }
  207. return TRUE;
  208. }
  209. //
  210. // 函数: WndProc(HWND, unsigned, WORD, LONG)
  211. //
  212. // 目的: 处理主窗口的消息。
  213. //
  214. // WM_COMMAND - 处理应用程序菜单
  215. // WM_PAINT - 绘制主窗口
  216. // WM_DESTROY - 发送退出消息并返回
  217. //
  218. //
  219. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  220. {
  221. int wmId, wmEvent;
  222. PAINTSTRUCT ps;
  223. HDC hdc;
  224. RECT rect;
  225. GetWindowRect(hWnd,&rect);
  226. switch (message)
  227. {
  228. case WM_CREATE:
  229. CreateChildWindow(hWnd);
  230. break;
  231. case WM_COMMAND:
  232. wmId = LOWORD(wParam);
  233. wmEvent = HIWORD(wParam);
  234. // 分析菜单选择:
  235. switch (wmId)
  236. {
  237. case IDM_ABOUT:
  238. DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
  239. break;
  240. case IDM_EXIT:
  241. DestroyWindow(hWnd);
  242. break;
  243. case BTN_1:
  244. switch(wmEvent)
  245. {
  246. case BN_CLICKED:
  247. OnLsBtnClicked();
  248. break;
  249. }
  250. break;
  251. default:
  252. return DefWindowProc(hWnd, message, wParam, lParam);
  253. }
  254. break;
  255. case WM_PAINT:
  256. hdc = BeginPaint(hWnd, &ps);
  257. // TODO: 在此添加任意绘图代码...
  258. DrawText(hdc,writeBuf,-1,&rect,DT_CENTER);
  259. EndPaint(hWnd, &ps);
  260. break;
  261. case WM_DESTROY:
  262. WSACleanup();
  263. PostQuitMessage(0);
  264. break;
  265. case WM_SOCKET:
  266. HandleSocket(wParam,lParam);
  267. break;
  268. default:
  269. return DefWindowProc(hWnd, message, wParam, lParam);
  270. }
  271. return 0;
  272. }
  273. // “关于”框的消息处理程序。
  274. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  275. {
  276. switch (message)
  277. {
  278. case WM_INITDIALOG:
  279. return TRUE;
  280. case WM_COMMAND:
  281. if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  282. {
  283. EndDialog(hDlg, LOWORD(wParam));
  284. return TRUE;
  285. }
  286. break;
  287. }
  288. return FALSE;
  289. }
共 0 条回复
暂时没有人回复哦,赶紧抢沙发
发表新回复

作者

sryan
today is a good day