VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 588|回复: 3

[交流] WSAAsyncSelect问题

[复制链接]
69_avatar_middle
在线会员 发表于 2016-5-4 00:49:19 | 显示全部楼层 |阅读模式
3驿站币
个人比较愚笨,sys版主讲解的视频看完以后,再看代码还是看不太明白,用的VS2012调试也没调试成功。(主要是习惯了C语言main函数顺序的思维方式,现在还不理解MFC和C++那种偏离散的那种代码风格,消息响应机制理解的也不好)

从网上找了个比较简单的,便于理解消息响应机制,对我这种不是特别聪明的,看起来舒服一些......
改了一下调试成功了,服务器代码如下:

  1. #define WM_SOCKET WM_USER+101
  2. #include <WinSock2.h>
  3. #pragma comment (lib,"WS2_32")

  4. LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
  5. BOOL InitApplication(HINSTANCE hInstance);
  6. BOOL InitInstance(HINSTANCE hInstance,int nShowCmd,HWND &Hwnd);
  7. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
  8. {
  9.         HWND hwnd;
  10.         InitApplication(hInstance);
  11.         InitInstance(hInstance,nShowCmd,hwnd);

  12.         WSADATA wsaData;
  13.         WORD wVersionRequested=MAKEWORD(2,2);
  14.         if(WSAStartup(wVersionRequested,&wsaData)!=0)
  15.         {
  16.                 MessageBox(NULL,"WSAStartup() Failed","调用失败",0);
  17.                 return 1;
  18.         }
  19.         SOCKET s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  20.         if(s==INVALID_SOCKET)
  21.         {
  22.                 MessageBox(NULL,"socket() Failed","调用失败",0);
  23.                 return 1;
  24.         }

  25.         sockaddr_in sin;
  26.         sin.sin_family=AF_INET;
  27.         sin.sin_port=htons(1111);
  28.         sin.sin_addr.S_un.S_addr=inet_addr("192.168.3.9");

  29.         if(bind(s,(sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR)
  30.         {
  31.                 MessageBox(NULL,"bind() Failed","调用失败",0);
  32.                 return 1;
  33.         }
  34.         if(listen(s,3)==SOCKET_ERROR)
  35.         {
  36.                 MessageBox(NULL,"listen() Failed","调用失败",0);
  37.                 return 1;
  38.         }
  39.         MessageBox(hwnd,"进入监听状态!","标题栏提示",MB_OK);

  40.         WSAAsyncSelect(s,hwnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE);

  41.         MSG msg;
  42.         while(GetMessage(&msg,0,0,0))
  43.         {
  44.                 TranslateMessage(&msg);
  45.                 DispatchMessage(&msg);
  46.         }
  47.         closesocket(s);
  48.         WSACleanup();
  49.         return msg.wParam;
  50. }

  51. BOOL InitApplication(HINSTANCE hInstance)
  52. {
  53.         WNDCLASS wc;
  54.         wc.style=CS_HREDRAW|CS_VREDRAW;
  55.         wc.lpfnWndProc=WindowProc;
  56.         wc.cbClsExtra=0;
  57.         wc.cbWndExtra=0;
  58.         wc.hInstance=hInstance;
  59.         wc.hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
  60.         wc.hCursor=LoadCursor(NULL,IDC_ARROW);
  61.         wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
  62.         wc.lpszMenuName=NULL;
  63.         wc.lpszClassName="Test";
  64.         return (RegisterClass(&wc));
  65. }

  66. BOOL InitInstance(HINSTANCE hInstance,int nShowCmd,HWND &Hwnd)
  67. {
  68.         HWND hwnd=CreateWindow("Test","窗口标题",WS_SYSMENU,300,0,600,400,NULL,NULL,hInstance,NULL);
  69.         if(hwnd==NULL)
  70.         {
  71.                 MessageBox(hwnd,"创建窗口出错","标题栏提升",MB_OK);
  72.                 exit(1);
  73.         }
  74.         ShowWindow(hwnd,SW_SHOWNORMAL);
  75.         UpdateWindow(hwnd);
  76.         Hwnd=hwnd;
  77.         return TRUE;
  78. }

  79. LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  80. {
  81.         switch(uMsg)
  82.         {
  83.         case WM_CLOSE:
  84.                 if(IDYES==MessageBox(hwnd,"是否确定退出","message",MB_YESNO))
  85.                         DestroyWindow(hwnd);
  86.                 break;
  87.         case WM_DESTROY:
  88.                 PostQuitMessage(0);
  89.                 break;
  90.         case WM_SOCKET:
  91.                 {
  92.                         SOCKET ss=wParam;
  93.                         if(WSAGETSELECTERROR(lParam))
  94.                         {
  95.                                 closesocket(ss);
  96.                                 return 0;
  97.                         }
  98.                         switch(WSAGETSELECTEVENT(lParam))
  99.                         {

  100.                         case FD_ACCEPT:
  101.                                 {
  102.                                         sockaddr_in Cadd;
  103.                                         int Cadd_len=sizeof(Cadd);
  104.                                         SOCKET sNew=accept(ss,(sockaddr *)&Cadd,&Cadd_len);
  105.                                         if(ss==INVALID_SOCKET)
  106.                                                 MessageBox(hwnd,"调用accept()失败","标题栏提示",MB_OK);
  107.                                         WSAAsyncSelect(sNew,hwnd,WM_SOCKET,FD_READ|FD_CLOSE);
  108.                                         break;
  109.                                 }
  110.                         case FD_READ:
  111.                                 {
  112.                                         char cbuf[256];
  113.                                         memset(cbuf,0,256);
  114.                                         int cRecv=recv(ss,cbuf,256,0);
  115.                                         if((cRecv==SOCKET_ERROR&&WSAGetLastError()==WSAECONNRESET)||cRecv==0)
  116.                                         {
  117.                                                 MessageBox(hwnd,"调用recv()失败","标题栏提示",MB_OK);
  118.                                                 closesocket(ss);
  119.                                         }
  120.                                         else if(cRecv>0)
  121.                                         {
  122.                                                 MessageBox(hwnd,cbuf,"收到的信息",MB_OK);
  123.                                                 char Sbuf[]="Hello client!I am server!";
  124.                                                 int isend=send(ss,Sbuf,sizeof(Sbuf),0);
  125.                                                 if(isend==SOCKET_ERROR||isend<=0)
  126.                                                         MessageBox(hwnd,"发送消息失败","标题栏提示",MB_OK);
  127.                                                 else
  128.                                                         MessageBox(hwnd,"已发送到客户端","标题栏提示",MB_OK);
  129.                                         }
  130.                                         break;
  131.                                 }
  132.                         case FD_CLOSE:
  133.                                 {
  134.                                         closesocket(ss);
  135.                                         break;
  136.                                 }
  137.                         }

  138.                 }
  139.                 break;
  140.         default:
  141.                 return DefWindowProc(hwnd,uMsg,wParam,lParam);

  142.         }

  143.         return 0;
  144. }
复制代码





上一篇:神奇算式。求大神帮忙。
下一篇:求助一个报数筛选的代码问题,运行无反应。
69_avatar_middle
ico_lz  楼主| 发表于 2016-5-4 00:51:38 | 显示全部楼层
不理解的地方,仔细看视频对应的课程说明。一开始可能看不大明白,但是多看几次,对程序和WSAAsyncSelect使用流程有了一点印象以后再看课程说明,会发现版主在里面讲的很详细。
51_avatar_middle
online_admins 发表于 2016-5-4 10:41:27 | 显示全部楼层
楼主的这个貌似不是问题,是自己理解掌握了是吧?那我把这个帖子转移到其他板块啦?
69_avatar_middle
ico_lz  楼主| 发表于 2016-5-7 11:19:41 | 显示全部楼层
Syc 发表于 2016-5-4 10:41
楼主的这个貌似不是问题,是自己理解掌握了是吧?那我把这个帖子转移到其他板块啦?

麻烦版主了。开始是有些没看懂的问题,不过每次打算问的时候又返回来回查,问题就解决了。这个也不知道该发哪个版块,就还是在提问区提交了。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-21 14:53

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表