`
webcode
  • 浏览: 5948700 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

VC中TCP实现 异步套接字编程的原理+代码

 
阅读更多

所谓的异步套接字编程就是调用了 如下函数

WSAAsyncSelect 设置了 套接字的状态为异步,有关函数我会在下面详细介绍。。。

异步套接字解决了 套接字编程过程中的堵塞问题 ...... 什么是堵塞?请看下面

你可能有过这样的体会 在 VC编写基于界面的网路程序时候 ,调用 recv recvfrom accept 等函数的时候 整个程序的主线程进入堵塞状态直到 有连接或者信息的到来。 我们可以利用多线程的方法解决主线程堵塞的问题,但是我们如果一个程序需要多个套接字 那么 就需要创建多个线程,线程创建多了回会导致一些不必要的麻烦 和操作上的不便。 我们利用非堵塞套接字可以解决这个问题 ,现在明白了吧 ,下面我讲讲述异步套接字实现 客户端服务端的通信 代码我会传到CSDN 大家可以去下载。。。。

当一个连接到来得时候 我这里假设是 基于TCP的服务器端 那么我要accept 一直等待 ,但是在异步套接字中 这个等待被转移了 。。我们吧acept放倒一个消息响应中来调用 只有 当某种我们希望的条件发生的时候才会调用accept 那么这里就是 只有 客户端connect 的时候才会调用accept 这样的话线程 永远不会堵塞 。

可能这样说的还有些模糊 下面 是一个TCP服务器端的 编写顺序 :

1 、首先加载套接字库 和包含必要的文件

#include "winsock2.h"

#pragma comment(lib,"ws2_32.lib")

2、加载套接字库 对服务器端和客户端 库版本要一直 我们这里是2.0的 套接字版本

WSADATA wsa ;

WSAStartup(MAKEWORD(2,0),&wsa) ;

3 、创建套接字 并且利用WSAAsyncSelect 设置为异步套接字 并且有网络事件发生的时候会发出 WM_SOCKET消息( 我们自定义的消息)

#deinfe WM_SOCKET WM_USER+1 ,对应的消息响应 要自己添加 不会下载我给的源代码

int WSAAsyncSelect(

SOCKET s, //socket

HWND hWnd, //要发送消息的窗体hwnd

unsigned int wMsg, //WM_SOCKET

long lEvent,//注意这个就是我们需要的网络事件具体看MSDN 我们一般只用到 FD_READ FD_ACCEPT 就是网络读取事件 和网络连接事件

);

4. 配置地址结构体SOCKADDR_IN 和调用bind绑定地址 结构体 然后调用 listen监听*(一定要在listen之前调用bind)

完成之后我们不用accept了 因为 这个需要我们在 消息响应函数 里面 来调用 因为我们感兴趣的 网络事件可能有多种那么 我们需要 在消息响应函数

用一个switch循环来判断是哪个网络事件 部分代码如下:

void CSynSocketSrvDlg::OnConnect(WPARAM wParam ,LPARAM lParam)
{

switch(lParam)
{
case FD_ACCEPT:
{
SOCKADDR addr ;
int len;
len=sizeof(SOCKADDR) ;
GetDlgItem(IDC_EDIT1)->SetWindowText("新的连接到来....\n") ;
tem=::accept(m_socket,(SOCKADDR*)&addr,&len) ;
break ;
}
case FD_READ:
{
char buf[100] ="";
recv(tem,buf,100,0) ;
GetDlgItem(IDC_EDIT1)->SetWindowText(buf) ;
break ;
}

}

}

客户端

1 、首先加载套接字库 和包含必要的文件

#include "winsock2.h"

#pragma comment(lib,"ws2_32.lib")

2、加载套接字库 对服务器端和客户端 库版本要一直 我们这里是2.0的 套接字版本

WSADATA wsa ;

WSAStartup(MAKEWORD(2,0),&wsa) ;

3 、创建套接字 并且利用WSAAsyncSelect 设置为异步套接字 并且有网络事件发生的时候会发出 WM_SOCKET消息( 我们自定义的消息)

#deinfe WM_SOCKET WM_USER+1 ,对应的消息响应 要自己添加 不会下载我给的源代码

int WSAAsyncSelect(

SOCKET s, //socket

HWND hWnd, //要发送消息的窗体hwnd

unsigned int wMsg, //WM_SOCKET

long lEvent,//注意这个就是我们需要的网络事件具体看MSDN 我们一般只用到 FD_READ 就是网络读取事件);

4、 然后我们可以发送数据了 发送是 send

接收消息和服务端一样在 消息响应函数里面实现

代码下载地址

http://download.csdn.net/detail/yue7603835/3771590

分享到:
评论

相关推荐

    异步套接字

    本人出于学习目的仿照CAsyncSocket原理封装的一个可独立处理消息的异步套接字CTSSocket类,与Client和Server端为一体的异步TCP流式套接字。

    VC++ 线程同步与异步套接字编程实例

    摘要:VC/C++源码,系统相关,线程同步,套接字编程 VC++线程同步与异步套接字编程实例源码,

    VC连接加密wifi,异步非阻塞TCP服务端、客户端

    VC连接加密wifi,异步非阻塞TCP服务端、客户端,环境为VS2013宽字节带套接字

    Visual C++网络编程案例_part2.rar

    第1篇介绍了Visual C++网络开发基础知识,包括Visual C++网络编程概述、Socket套接字编程和多线程与异步套接字编程。第2篇介绍了7大类网络开发典型应用案例的实现,包括FTP客户端实现之一、 FTP客户端实现之二、网页...

    WinSock网络编程实用宝典

    基本套接字 典型过程图 Windows Socket1.1 程序设计 简介 主要扩充说明 Windows Sockets网络程序设计核心 实例应用 基于Visual C++的Winsock API研究(1) 基于Visual C++的Winsock API研究(2) ...

    Visual C++网络编程案例part1

    第1篇介绍了Visual C++网络开发基础知识,包括Visual C++网络编程概述、Socket套接字编程和多线程与异步套接字编程。第2篇介绍了7大类网络开发典型应用案例的实现,包括FTP客户端实现之一、 FTP客户端实现之二、网页...

    VC串口通讯程序和以太网通讯程序

    自己用VC写的以太网通讯程序和串口通讯程序,已经经过试验验证。之前上传的一个版本串口通讯存在一些bug,本次已经修正这些问题。串口通讯采用MFC的API编写,采用异步通讯方式,专门...TCP/IP通讯采用MFC异步套接字编写。

    VC实现最简单的UDP通信

    在Windows 95环境下,基于TCP/IP协议,用Winsock完成了话音的端到端传输。采用双套接字技术,阐述了主要函数的使用要点,以及基于异步选择机制的应用方法。同时,给出了相应的实例程序

    vc++ 开发实例源码包

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    Windows编程循序渐进.part2

    7.3 套接字编程 85 7.3.1 函数介绍 85 7.3.2 实例:Ping程序 88 7.3.3 实例:网络嗅探器 92 7.4 服务器与客户端模型 96 7.4.1 实例:TCP服务端和客户端程序 96 7.4.2 实例:UDP服务器和客户端程序 100 7.5 ...

    Windows编程循序渐进.part3

    7.3 套接字编程 85 7.3.1 函数介绍 85 7.3.2 实例:Ping程序 88 7.3.3 实例:网络嗅探器 92 7.4 服务器与客户端模型 96 7.4.1 实例:TCP服务端和客户端程序 96 7.4.2 实例:UDP服务器和客户端程序 100 7.5 ...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    一个服务器对多个客户端双方可互通信息

    客户端和服务器都是基于TCP协议,用SOCKET编程,设置的是异步模式,双方都可通信,且代码有注释,测试IP为回送地址-127.0.0.1,端口号为80,可在一台计算机上测试,也可在一个局域网内实现飞鸽传书,进行多方通话

    计算机网络常见问题解答

    问题5-4:一个套接字能否同时与远地的两个套接字相连? 问题5-5:数据链路层的HDLC协议和运输层的TCP协议都使用滑动窗口技术。从这方面来进行比较,数据链路层协议和运输层协议的主要区别是什么? 问题5-6:TCP协议...

Global site tag (gtag.js) - Google Analytics