占位##

#include <WinSock2.h>
#include <Windows.h>
#include <StrSafe.h> #pragma comment(lib, "Ws2_32") #define WM_SOCKET WM_USER+1 //定义SOCKET消息; LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_SOCKET:
{
if(WSAGETSELECTERROR(lParam))
{
shutdown(wParam, SD_BOTH);
closesocket(wParam);
return ;
} switch (WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
{
SOCKET client = accept(wParam, NULL, NULL);
WSAAsyncSelect(client, hWnd, WM_SOCKET, FD_READ | FD_WRITE | FD_CLOSE);
}
break;
case FD_WRITE:
break;
case FD_READ:
{
CHAR szText[] = { };
if (SOCKET_ERROR == recv(wParam, szText, , ))
{
shutdown(wParam, SD_BOTH);
closesocket(wParam);
}
else
{
CHAR szMsg[] = "接收数据:";
strcat_s(szMsg, sizeof(szMsg), szText);
MessageBoxA(hWnd, szMsg, "结果", MB_OK);
}
}
break;
case FD_CLOSE:
shutdown(wParam, SD_BOTH);
closesocket(wParam);
break;
}
}
return ; case WM_DESTROY:
PostQuitMessage();
return ;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
} int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR pcszCommand, int iShow)
{
TCHAR szAppName[] = TEXT("WSAAsyncSelect");
WNDCLASSEX wndClsEx; wndClsEx.cbClsExtra = ;
wndClsEx.cbSize = sizeof(wndClsEx);
wndClsEx.cbWndExtra = ;
wndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndClsEx.hIconSm = NULL;
wndClsEx.hInstance = hInstance;
wndClsEx.lpfnWndProc = WinProc;
wndClsEx.lpszClassName = szAppName;
wndClsEx.lpszMenuName = NULL;
wndClsEx.style = CS_HREDRAW | CS_VREDRAW; if (!RegisterClassEx(&wndClsEx))
{
MessageBox(NULL, TEXT("注册窗口类失败,本程序需要在Windows NT系统上才能运行。"), TEXT("错误"), MB_OK | MB_ICONERROR);
return ;
} HWND hWnd = CreateWindowEx(
,
szAppName,
szAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if (NULL == hWnd)
{
MessageBox(NULL, TEXT("创建窗口失败"), TEXT("错误"), MB_OK | MB_ICONERROR);
return ;
} ShowWindow(hWnd, iShow);
UpdateWindow(hWnd); WSADATA wsaData;
WSAStartup(WINSOCK_VERSION, &wsaData); SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sListen)
{
MessageBox(hWnd, TEXT("创建套接字失败"), TEXT("错误"), MB_OK | MB_ICONERROR);
WSACleanup();
return ;
} SOCKADDR_IN sin;
USHORT uPort = ; ZeroMemory(&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(uPort);
sin.sin_addr.S_un.S_addr = INADDR_ANY; if (SOCKET_ERROR == bind(sListen, (PSOCKADDR)&sin, sizeof(sin)))
{
MessageBox(hWnd, TEXT("绑定套接字失败"), TEXT("错误"), MB_OK | MB_ICONERROR);
shutdown(sListen, SD_RECEIVE);
closesocket(sListen);
WSACleanup();
return ;
} //将套接字设为窗口通知消息类型
WSAAsyncSelect(sListen, hWnd, WM_SOCKET, FD_ACCEPT | FD_CLOSE);
listen(sListen, ); MSG msg;
while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} WSACleanup();
return msg.wParam;
}

winSockets编程(七)WSAAsyncSelect模式的更多相关文章

  1. 深度分析Linux下双网卡绑定七种模式 多网卡的7种bond模式原理

    http://blog.csdn.net/abc_ii/article/details/9991845多网卡的7种bond模式原理 Linux网卡绑定mode共有七种(~) bond0.bond1.b ...

  2. Java多线程编程中Future模式的详解

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  3. OSI七层模式简单通俗理解

    OSI七层模式简单通俗理解 这个模型学了好多次,总是记不住.今天又看了一遍,发现用历史推演的角度去看问题会更有逻辑,更好记.本文不一定严谨,可能有错漏,主要是抛砖引玉,帮助记性不好的人.总体来说,OS ...

  4. Java多线程编程中Future模式的详解<转>

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  5. javascript 面向对象编程(工厂模式、构造函数模式、原型模式)

      javascript 面向对象编程(工厂模式.构造函数模式.原型模式) CreateTime--2018年3月29日17:09:38 Author:Marydon 一.工厂模式 /** * 工厂模 ...

  6. 【并发编程】Future模式添加Callback及Promise 模式

    Future Future是Java5增加的类,它用来描述一个异步计算的结果.你可以使用 isDone 方法检查计算是否完成,或者使用 get 方法阻塞住调用线程,直到计算完成返回结果.你也可以使用  ...

  7. restapi(7)- 谈谈函数式编程的思维模式和习惯

    国庆前,参与了一个c# .net 项目,真正重新体验了一把搬砖感觉:在一个多月时间好像不加任何思考,不断敲键盘加代码.我想,这也许是行业内大部分中小型公司程序猿的真实写照:都是坐在电脑前的搬砖工人.不 ...

  8. [LINQ2Dapper]最完整Dapper To Linq框架(七)---仓储模式

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  9. 实例解析Python设计模式编程之桥接模式的运用

    实例解析Python设计模式编程之桥接模式的运用 这篇文章主要介绍了Python设计模式编程之桥接模式的运用,桥接模式主张把抽象部分与它的实现部分分离,需要的朋友可以参考下 我们先来看一个例子: #e ...

随机推荐

  1. Java(JFinal)实现sqlserver2017的数据库的备份与恢复

    1.连接数据库的代码: package com.once.xfd.dbutil; import java.sql.Connection; import java.sql.DriverManager; ...

  2. Python中setup.py一些不为人知的技巧

    http://python.jobbole.com/80912/ 在我开始之前,我想先说清楚我将要解释的是些“窍门”.他们不是“最好的做法”,至少在一种情况下是不可取的. 说到不可取的做法,我会适时写 ...

  3. u-boot之内核是怎么启动的

    在u-boot之start_armboot函数分析已经分析过了整个程序框架,但只是说了下什么时候运行内核,并没有具体说明是怎么执行内核的.内核启动分以下几个步骤说明: 1.启动参数bootcmd=na ...

  4. MSDos

    一.简介   二.源码 http://www.computerhistory.org/atchm/microsoft-research-license-agreement-msdos-v1-1-v2- ...

  5. iserver-数据库型数据源导入后原dataset名称和数据库表名不一致的问题

    一.发现问题 系统中发现某个房屋的分层平面图查询不到 1.去sqlserver空间库中查询发现这个表‘房间_100200T001D001’不存在 2.在工作空间中查询发现是有这个数据集的 二.解决问题 ...

  6. 多进程copy文件

    from multiprocessing import Pool,Manager import os,time def copyFileTask(fileName,oldFolderName,newF ...

  7. Linux内核哈希表分析与应用

        目录(?)[+]   Linux内核哈希表分析与应用 Author:tiger-johnTime:2012-12-20mail:jibo.tiger@gmail.comBlog:http:// ...

  8. POJ1659 Frogs' Neighborhood(青蛙的邻居) Havel-Hakimi定理

    Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 8729   Accepted: 36 ...

  9. How to Change MAC Address on Ubuntu

    1 Open Terminal.   2 Log in as root so type: sudo -i and then write your password.   3 View your cur ...

  10. jmeter多用户并发

    1.需要参数化 2.单用户需要在请求头里面传入cookie