【转】 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

参考: http://blog.csdn.net/yue7603835/article/details/6949817

时间: 2024-11-10 10:26:54

【转】 VC中TCP实现 异步套接字编程的原理+代码的相关文章

TCP下的套接字编程

1.什么是套接字 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口.区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址.使用的传输层协议(TCP或UDP)和使用的端口号.Socket原意是"插座".通过将这3个参数结合起来,

【Python网络编程】利用Python进行TCP、UDP套接字编程

之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接字将该行发送到服务器. 2.服务器从其连接套接字读取一行字符. 3.服务器将该行字符转换成大写. 4.服务器将修改后的字符串(行)通过连接套接字再发回给客户机. 5.客户机从其套接字中读取修改后的行,然后将该行在其标准输出(监视器)上打印出来. [TCP]服务器端代码: import socket

VC基于消息的异步套接字

用WSAStartup,需要在StdAfx.h头文件中需要声明 #include    #pragma   comment(lib,"WS2_32.lib") 用AfxSocket,需要在StdAfx.h头文件中需要声明 #include 用到了两种,则需要: #include    #pragma   comment(lib,"WS2_32.lib") #include 上述方法是否可行,需要验证?(在三门峡自动化收购管理系统中,用到了上述内容) 1.在[项目名.

TCP和UDP套接字编程 (java实现)

在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程接口! 关于TCP和UDP这里就不作太多介绍了,我们知道TCP是面向连接的,UDP是不面向连接的,TCP可靠,UDP不可靠即可! 我们来设计一个应用来示范一下,流程: 客户机从键盘读取一行字符串,并通过套接字发送到服务器. 服务器从连接的套接字获取这行字符串,并对其进行修改(将小写转为大写),最后再

线程同步与异步套接字编程(二)

接下来我们介绍利用关键代码段实现线程同步的方法. 关键代码段(临界区)工作在用户方式下.它是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权. 关键代码段机制,创建---进入---离开---删除. 1 InitializeCriticalSection( 2 LPCRITICAL_SECTION lpCriticalSection 3 ); 创建初始化函数参数是一个out类型,即作为返回值使用.因此在之前我们需要构造一个CRITICAL_SECTION结构型对象,然后将该对象地址传

Windows异步套接字(WSASocket)

异步套接字: 如果使用阻塞的套接字的话,在控制台下还好!如果是WIN32程序的话,那么就容易造成界面的假死,因为接收函数一直等待有消息进来之后才会被返回!所以此时界面一直属于假死的状态,如果你乱动的话,那么就容易真死了.解决办法如下: 第一:使用多线程技术,多线程和SOCKET结合的话,可以使用单独一个线程来接收消息.这样即使接收函数阻塞了也不会影响其他线程,例如界面线程.但是如果使用多线程的话,就必须要考虑到多线程之间同步的问题,以及临界资源的问题. 第二:使用异步套接字.但是使用异步套接字的

基于TCP协议的socket套接字编程

基于TCP协议的socket套接字编程 一.什么是Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议. 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的. [ 注意:也有

linux 套接字编程入门--Hello World

下述代码是linux套接字编程的入门代码.分为服务端和客户端源码. 服务端代码的主要流程是绑定ip地址和端口号建立套接字,等待客户端发起访问.接受客户端请求之后,向客户端发送字符串"hello world",关闭套接字,结束程序. 客户端代码的主要流程是向服务端对应的套接字发起请求,读取服务端发送的数据,并且打印出来. 代码已经详细注释,更多细节不再赘述. server.cpp #include<stdio.h> #include<stdlib.h> #incl

深入理解基本套接字编程

随着网络编程(C/C++)的学习,发现自己对于基本套接字编程有些细节还是不太清楚,然后又查看了对应的书籍和资料,趁着这段时间把这些基础知识梳理了一下,便于自己回顾,同时大家也可以作为参考 :) ~ 套接字地址结构 struct in_addr { in_addr_t s_addr; // 32-bit IPv4 address //network byte ordered } struct sockaddr_in { sa_family_t sin_family; //AF_INET in_po