关于WSAAsyncSelect模型的一些困惑,困扰我好多天了

浅谈WinSock I/O模型之异步选择(WSAAsyncSelect) 异步选择,顾名思义就是WSAAsyncSelect模型是Select模型的异步版本,在调用select()函数时,会发生阻塞现象。可以通过select()函数timeout参数,设置函数调用的阻塞时间。在设定的时间内,线程保持等待,直到其中一个或多个套接字满足可读可写的条件时,该函数返回。首先我们将异步选择与select模型进行比较:相同点:他们都可以对Windows套接字应用程序所使用的多个套接... 阅读详情

我最近在VS2013平台上用MFC写一个即时通信的软件,其中用到了WSAAsyncSelect()模型,其实我是个初学者,这个模型没见过,我查了很多资料,也看了很多博客,好像能理解了,就写了个测试的程序,结果大失所望,找不到问题出在那里,也许我就根本没有理解透彻,求哪位大神帮我解答~~感激不尽!!QQ:893828960

服务端

// TS1sDlg.h : 头文件

#pragma once

#define WM_SOCKET WM_USER+1000                           //--------------------
// CTS1sDlg 对话框
class CTS1sDlg : public CDialogEx
{
// 构造
public:
CTS1sDlg(CWnd* pParent = NULL);// 标准构造函数
BOOL InitNetwork(); //初始化网络函数
// 对话框数据
enum { IDD = IDD_TS1S_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
sockaddr_in addr, cliaddr;
SOCKET s, s1;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
LRESULT afx_msg  OnSocket(WPARAM wParam, LPARAM lParam);    //---------------------
DECLARE_MESSAGE_MAP()
};

--------------

// TS1sDlg.cpp : 实现文件
#include "stdafx.h"
#include "TS1s.h"
#include "TS1sDlg.h"
#include "afxdialogex.h"
#include "Resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CTS1sDlg 对话框
CTS1sDlg::CTS1sDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CTS1sDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTS1sDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CTS1sDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_SOCKET,OnSocket)
ON_BN_CLICKED(IDC_BUTTON1, &CTS1sDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// CTS1sDlg 消息处理程序
BOOL CTS1sDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE);// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标
// TODO:  在此添加额外的初始化代码
WSADATA data = { 0 };//定义结构体变量
DWORD ss = MAKEWORD(2, 0);//初始化SOCKET库
::WSAStartup(ss, &data);//初始化套接字库
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)
{
MessageBox(_T("创建套接字失败!"));
closesocket(s);
WSACleanup();
return FALSE;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(1688);
addr.sin_addr.S_un.S_addr = inet_addr("172.18.17.60");
if (bind(s, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
{
MessageBox(_T("绑定地址失败!"));
closesocket(s);
WSACleanup();
return FALSE;
}
listen(s, 5); //设置侦听模式
//将s设置为异步非阻塞模式,并为它注册各种网络异步事件,其中m_hWnd为应用程序的主对话框或主窗口的句柄
if (WSAAsyncSelect(s, m_hWnd, WM_SOCKET,
FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR)
{
MessageBox(_T("注册网络异步事件失败!"));
WSACleanup();
return FALSE;
}
MessageBox(_T("服务器已启动,正在等待客户端连接。"), _T("YY提醒"));
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CTS1sDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。
void CTS1sDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CTS1sDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
LRESULT CTS1sDlg::OnSocket(WPARAM wParam, LPARAM lParam)
{
//调用Winsock API函数,得到网络事件类型
int iEvent = WSAGETSELECTEVENT(lParam);
//调用Winsock API函数,得到发生此事件的客户端套接字
SOCKET CurSock = (SOCKET)wParam;
//查看是否出错  
if (WSAGETSELECTERROR(lParam))
{
MessageBox(_T("出错"));
::closesocket(CurSock);
return 0;
}
switch (iEvent)
{
case FD_ACCEPT:            //套接字连接事件
{
// MessageBox(_T("有请求连接"));                      //----------------此处不注释的话,会一直弹出此框(不明白)
//应答请求
s1 = ::accept(CurSock, (SOCKADDR*)&cliaddr, (int*)sizeof(cliaddr));
if (s1 < 0)
MessageBox(_T("连接失败"));
/* else                                                                          //--------------------此处不注释的话, 客户端连接后会出错(不明白)
MessageBox(_T("连接成功"));
*/
}
break;
case FD_READ:
{
MessageBox(_T("有数据到来"));
char buff[20];
int status;
status = recv(CurSock, buff, sizeof(buff), 0);
if (status < 0)
MessageBox(_T("接收失败"));
else
{
CString str =(CString)buff;
/* CString str1 = _T("hello!");
GetDlgItem(IDC_EDIT1)->SetWindowText(str1); */

GetDlgItem(IDC_EDIT1)->SetWindowText(str1)
}
}
break;
default:break;
}
return 0;
}

问题:case FD_READ: 当客户端发送信息过来的时候这里没有反应。

我的想法是这样的,启动服务器,客户端,客户端发送信息过了,在下面的编辑框显示。



客户端
// TS2cDlg.cpp : 实现文件                      //客户端还要设置为WSAAsyncSelec吗?
#include "stdafx.h"
#include "TS2c.h"
#include "TS2cDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CTS2cDlg 对话框
CTS2cDlg::CTS2cDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CTS2cDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTS2cDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CTS2cDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_LOAD, &CTS2cDlg::OnBnClickedLoad)
END_MESSAGE_MAP()
// CTS2cDlg 消息处理程序
BOOL CTS2cDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE);// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标
// TODO:  在此添加额外的初始化代码
WSADATA data = { 0 };//定义结构体变量
DWORD ss = MAKEWORD(2, 0);//初始化SOCKET库
::WSAStartup(ss, &data);//初始化套接字库
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)
{
MessageBox(_T("创建套接字失败!"));
closesocket(s);
WSACleanup();


}
addr.sin_family = AF_INET;
addr.sin_port = ntohs(1688);
addr.sin_addr.S_un.S_addr =inet_addr("172.18.17.60");
Onconnect();
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CTS2cDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。
void CTS2cDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CTS2cDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CTS2cDlg::Onconnect()
{
if (connect(s, (sockaddr *)&addr, sizeof(addr)) != SOCKET_ERROR)
MessageBox(_T("连接成功"));
else
MessageBox(_T("连接失败"));
}
void CTS2cDlg::OnBnClickedLoad()
{
// TODO:  在此添加控件通知处理程序代码
char msg[20] = "hello,i love you!";
int status = send(s, msg, sizeof(msg),0);
if (status < 0)
MessageBox(_T("发送失败"));
else
MessageBox(_T("发送成功"));
}

WSAAsyncSelect模型 WSAAsyncSelect模型 对学习网络传输响应模型是很好的课件 立即下载

相关推荐

MFC Winsock编程实现的客户端和服务器端的P2P通信程序

使用WSAAsyncSelect模型实现的局域网P2P通讯程序,里面包含服务器端和客户端程序

基于WSAAsyncSelect模型的服务端和客户端设计(MFC)

目录1 效果展示1.1 服务器和客户端界面展示1.2 一对一之间通信的功能展示1.3 一对多之间通信的功能展示2 知识预备2.1 WSAAsyncSelect模型介绍2.2 WSAAsyncSelect模型的过程图2.3 与SELECT模型比较2.4 套接字WSAAsyncSelect模型实现2.5 网络事件种类2.6 WSAAsyncSelect模型的优势和不足3 代码展示3.1 服务端3.1.1 定义变量3.1.2 初始化界面3.1.3 启动服务器3.1.4 消息响应3.1.5 发送消息3.1.5 断开

weixin_45984283的博客 4544

基于WSAAsyncSelect异步操作TCP socket服务器

基于WSAAsyncSelect异步操作TCP socket服务器 FD_READ 应用程序想要接收有关是否可读的通知,以便读入数据 FD_WRITE 应用程序想要接收有关是否可写的通知,以便写入数据 FD_OOB 应用程序想接收是否有带外(OOB)数据抵达的通知 FD_ACCEPT 应用程序想接收与进入连接有关的通知 FD_CONNECT 应用程序想接收与一次连接或者多点join操作完成的通知 FD_CLOSE 应用程序想接收与套接字关闭有关的通知 FD_QOS 应用程序想接收套接字“服务质量”(QoS)发生更改的通知 FD_GROUP_QOS 应用程序想接收套接字组“服务质量”发生更改的通知(现在没什么用处,为未来套接字组的使用保留) FD_ROUTING_INTERFACE_CHANGE 应用程序想接收在指定的方向上,与路由接口发生变化的通知 FD_ADDRESS_LIST_CHANGE 应用程序想接收针对套接字的协议家族,本地地址列表发生变化的通知

异步选择WSAAsyncSelect

原文地址:http://blog.youkuaiyun.com/jofranks/article/details/7917749    大家用这个模型,可以让应用程序在一个套接字上接收以windows消息为基础的网络事件通知。我们想要用这个操作,具体的做法就是我们建立一个套接字,然后调用WSAAsyncSelect函数, 也就是说,这个模型的核心就是我们的这个函数; 来看一下函数原型:

y___y___的专栏 812

WSAAsyncSelect客户端

WSAAsyncSelect客户端 实现客户端与服务器的连接通信。 希望大家批评指教

Win10/Win11系统下,用VSCode编译Betaflight固件最全避坑指南(从GCC安装到HEX生成)

本文详细介绍了在Win10/Win11系统下使用VSCode编译Betaflight固件的完整流程,包括GCC安装、环境变量配置、终端选择、Make工具安装等关键步骤,帮助开发者避开常见陷阱,高效生成HEX文件。特别针对VSCode环境优化和编译错误排查提供了实用解决方案。

weixin_42557803的博客 415

详细解析WSAAsyncSelect模型

WSAAsyncSelect模型是Windows socket的一个异步IO模型。利用该模型可以接收以Windows消息为基础的网络事件。Windows sockets应用程序在创建套接字后,调用WSAAsyncSelect函数注册感兴趣的网络事件,当该事件发生时Windows窗口收到消息,应用程序就可以对接收到的网络时间进行处理。WSAAsyncSelect是select模型的异步版本。在应用程

liujiayu2的专栏 1万+

硅传CC1310二次开发必备:手把手教你用JTAG解锁被锁定的Flash存储器

本文针对硅传CC1310模块二次开发中常见的Flash锁定问题,提供了从原理剖析到实战操作的完整解决方案。详细介绍了如何使用Uniflash和Flash Programmer 2等工具进行Flash解锁和擦除,并强调了硬件连接稳定性与供电质量的关键作用,帮助开发者彻底解决烧录障碍,为后续应用开发铺平道路。

weixin_29189373的博客 254

MFC异步WSAAsyncSelect 在vs2015下编译出错的问题

在vc6.0下用的WSAAsyncSelect相关代码,放在vs2015下编译会报错。 解决这个问题有两种方法。 1.一个是使用 WSAEventSelect()函数替换WSAAsyncSelect() 2.如果要用WSAAsyncSelect() 方法就需要在 “stdafx.h” 文件中添加上下面这句,即可。  #define _WINSOCK_DEPRECATED_NO_WA

Dreamer_Ye的专栏 794

快手极速版抓包实战:安卓/iOS双端获取client_salt全流程解析(避坑指南)

本文详细解析了在安卓和iOS平台上获取快手极速版关键参数`client_salt`的全流程,包括环境配置、抓包工具使用、参数识别与转换等实战技巧。特别针对双端差异和反抓包机制提供了避坑指南,帮助开发者高效安全地完成数据获取任务。

weixin_29021195的博客 714

【软考】高项论文写作常见模板

本文主要介绍了YYYY年MM月DD日,我所在公司承接了XXXX项目的建设过程,包括了XXX,XXX,XXX内容,涉及到XXX,XXX,XXX技术。本人在项目中承载着项目经理的角色,主要负责了XXX,XXX,XXX方面事宜。此项目时间紧,任务重,实施过程中,我们特别注重了1、XXX 2、XXX 3、XXX几个方面,经过团队的一致努力,本项目按时交付,运行至今,客户反馈良好。但是在实施过程中,也曝露除了一些问题,包括了XXX,XXX等,通过应急处理和协调,这些问题都得到了妥善解决,没有影响到项目进度。

奶爸的编程之路,也就一周冷个三天 1689

MFC 基于消息机机制的WSAAsyncSelect demo

1. 添加头文件 #include #pragma comment(lib, "ws2_32.lib")   服务端: 1. 定义变量 SOCKET sSocket; 2. 定义消息常量 #define MSG_SOCKET (WM_USER + 1000)

lwstar23133的专栏 2047

微信小程序 - 详细实现随机生成订单号,微信小程序创建订单号思路,不重复订单号生成的方法,小程序自动生成固定规则的订单号流水号(必须是唯一不重复的订单号,生成唯一订单号)详细生成方法,示例代码教程最新

微信小程序,vue2,vue3,订单号,流水号思路,微信小程序 详细实现随机生成订单号(JavaScript),随机生成商户订单号,根据当前时间随机生成流水号或者订单号,微信小程序之商家订单,订单号随机生成器,自动生成固定规则的订单号(前缀+采购日期+6位流水号)微信小程序 生成外卖顺序号,生成订单号或流水号简单方法,实现订单号生成唯一的解决方案,如何按日期生成订单号,14位编号=8位日期(+6位流水号),自动生成订单号(固定+日期+数字),销售订单号自动生成。在微信小程序开发中,详解实现随机生成创建订单号

🏆 前端领域优质创作者 1187

用WSAAsyncSelect对UDP进行非阻塞的响应,须注意

只能响应第一次?可能原因:有数据到达,必须接收数据,否则,下一个数据到达的时候不会发送消息的

AZHANG00000的专栏 1616

基于STM32F1XX 、HAL库的OPT4001-Q1环境光传感器驱动应用C语言程序设计

OPT4001-Q1 的输出是半对数 的,具有 9 个二进制对数满量程照度范围,每个范围内具有高度线性响应,使得 PicoStar™ 型号的测量能力为 312.5μlux 至 84klux,USON 型号的测量能力为 400µlux 至 107klux。// 禁用中断(示例)

PP_Cottage的博客 462

【银河麒麟服务器操作系统】安装英伟达4090D显卡驱动操作指南

本文详细介绍了在银河麒麟高级服务器操作系统V10SP3-2403-X86版本上安装NVIDIA RTX4090D显卡驱动的完整流程。主要内容包括:准备工作检查、开源驱动禁用、运行级别切换、依赖包安装以及交互式安装过程中的关键选项选择(32位库选Yes、X配置选No)。通过禁用nouveau驱动、重建内核引导等步骤确保驱动安装成功,最后通过nvidia-smi命令验证驱动安装情况。文档提供了操作检查表和安装流程图,帮助用户在银河麒麟系统上顺利完成显卡驱动部署。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 3105

WSAAsyncSelect 模型 - 还是接着以前的socket、 部分继续研究, 近期将精力 放在各种模型上面,比较缺点,实现出来

  WSAAsyncSelect 模型允许应用程序以windows消息的形式接受网络事件通知这个模型是为了适应windows的 消息驱动环境设置的, 对性能要求不高的网络应用程序采用这个模型,MFC的CSoket采用这个模型 WSAAsyncSelect 函数会自动把函数设置为非阻塞模式,并且为套接字绑定一个窗口句柄当有网络时间发生时,向这个窗口发消息int WSAAsyn

dove1980的专栏 871

2024年电气工程师最新面试题及答案

1. **基本电气工程原理**:包括电流、电压、电阻、功率等基本概念。2. **欧姆定律**:V = IR,描述电压、电流和电阻之间的关系。42. **风力发电系统组成**:包括风力涡轮机、发电机、控制系统等。44. **智能电网技术**:包括自动化控制、通信技术、数据分析等。10. **减少EMI**:使用屏蔽、滤波、合理布线等方法。40. **光伏系统组成**:包括光伏板、逆变器、控制器等。48. **能量存储技术**:包括电池、超级电容器、飞轮等。

guo162308的博客 6564

网络编程Socket之UDP(三)超时设置和非阻塞

前面遗留的两个问题: 1.客户

小T是我 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

WSAAsyncSelect模型详解

首先,我想说明一下,这篇文章是我在阅读《精通Windows Sockets 网络开发——基于Visual C++》(孙海民 编著,人民邮电出版社出版)这本书的时候,基于这本书归纳总结的一些关于网络编程中WSAAsyncSelect模型的知识。个人觉得这是一本很好的关于Windows Sockets 网络编程的书籍,对网络编程感兴趣或者有项目需要参考书的话,这本书是一个不错的选择。特别说明:本文中的

遨游网络huster的专栏 2875

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

学习笔记之WSAAsyncSelect模式

大体原理:WSAAsyncSelect模式允许以windows消息的形式接收网络事件通知。这个模式是为了适应windows消息驱动环境而设置的,对性能要求不高的网络应用程序可采用此模式。 要注意的地方:网络事件消息抵达消息处理函数后,应用程序首先检查Lparam参数的高位,以判断在套接字上发生了网络错误。宏WSAGETSELECTERROR返回高字节包含的错误信息。若应用程序发现套接字...

weixin_30797199的博客 145

理解 Linux 动态库加载:LD_LIBRARY_PATH

flyfish

二分掌柜的 382
下一篇: 学习C++ vector(摘录)
yyb520a
博客等级 码龄14年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值