zoukankan      html  css  js  c++  java
  • CSocket类网络编程 MFC

    Visual C++的MFC提供了CSocket类用来实现网络通信。

    下面介绍VC++在Windows 95中实现Socket的 CSocket 类相关成员函数(这些成员函数实际上是从CAsyncSocket 类继承来的)的使用。 

    (1) BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, long lEvent = FD_READ |FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT| FD_CLOSE,LPCTSTR lpszSocketAddress = NULL ) 
      该函数用来建立Socket。 其中,nSocketPort 为所选择的Socket 端口,一般要大于 1023, 如果该参数为0,则由系统选定一端口,默认值为0 ;nSocketType 为套接字类型:SOCK_STREAM 表示为流套接字,SOCK_DGRAM 表示为数据报套接字,默认值为SOCK_STREAM ;lEvent 标识该Socket 要完成哪种工作,默认值为FD_READ|FD_WRITE|FD_OOB| FD_ACCEPT|FD_CONNECT|FD_CLOSE ;lpszSockAddress 为网络地址信息结构指针,包含网络地址, 默认值为NULL 。 

    (2)BOOL Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL ) 
      该函数的作用是将Socket 端口与网络地址连接起来。参数含义同上 。 
    (3)BOOL Listen( int nConnectionBacklog = 5 ) 
      该函数的作用是等待Socket请求。其中,nConnec-tionBacklog 表示等待队列的长度,默认值为最大值5 。 

    (4)virtual BOOL Accept( CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr = NULL, int* lpSockAddrLen = NULL ) 
      该函数的作用是取得队列上第一个连接请求并建立一个具有与Socket相同特性的套接字。其中,rConnectedSocket 表示一个新的Socket 。 

    (5)BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort ) 
      该函数的作用是提出请求。其中,lpszHostAddress 和 nHostPort 为接受请求进程的网络地址和Socket 端口号。 

    (6)virtual void Close( ) 
      该函数的作用是关闭该Socket 。 

      利用CSocket类直接进行数据通信有两种方式:一种是利用CSocketFile 类和Archive 类去实现,另一种是利用CSocket的成员函数 Receive、Send、ReceiveFrom、SendTo、Listen 和 Accept 等来实现(这些成员函数实际上也是从CAsyncSocket 类继承的)。 
      两种方法的实现步骤如下 : 

      Server : Construct-> Creat-> Bind -> Listen-> Accept-> Send->Close ; 

      Cilent : Construct ->Creat-> Connect-> Receive-> Close。 

       下面就用VC++的代码分别介绍如何运用上述两种方法来实现Socket 编程。 

      1、 利用CSocketFile类和Archive 类实现

      (1)服务器程序流程
      // 创建一个套接字对象
      CSocket sockSrvr; 

      //为上述套接字对象创建一个套接字

      sockSrvr.Create(nPort); 

      //开始侦听
      sockSrvr.Listen( ); 

      //创建一个新的套接字对象
      CSocket sockRecv; 

      //接受连接
      sockSrvr.Accept( sockRecv ); 

    // 创建文件对象
    CSocketFile file(&sockRecv); 

      //创建一个archive对象
      CArchive arIn(&file, CArchive::load); 

      /*or*/_CArchive arOut(&file, CArchive::store); 

      //使用archive对象传输数据
      arIn >> dwValue; 

      /*or*/ arOut < < dwValue; 

      (2)客户端程序流程
      //创建一个套接字对象
      CSocket sockClient; 

      //为这个对象创建一个套接字
      sockClient.Create( ); 

      //寻找一个连接
      sockClient.Connect(strAddr, nPort); 

      //创建一个文件对象
      CSocketFile file(&sockClient); 

      //创建一个archive对象
      CArchive arIn(&file, CArchive::load); 

      /*or*/_CArchive arOut(&file, CArchive::store); 

      //使用这个对象传输数据
      arOut < < dwValue; 

      /*or*/ arIn >> dwValue; 

      上述程序中, nPort 是Socket 的端口号,strAddr 是该机器的IP地址(如202.197.1.3 或 FTP://RedAlert.com等),这两个变量在Server和Client中要一致。当Server进程运行至Listen 后便处于睡眠状态直到Client进程执行Connect 时才被唤醒,而后两个进程便开始传输数据了。 

      2、利用CSocket的成员函数实现 
      (1)服务器流程
      //套接字初始化
      if(!AfxSocketInit()){ 
       MessageBox("WindowsSocket initial failed!","Send",MB_ICONSTOP); 
       Return; 
      }

      // 创建两个套接字对象
      CSocket ChatSend,server; 

      // 创建一个套接字
      if(!ChatSend.Create(nPort)) // nPort=1025 
       MessageBox("SendSocket create failed!", "Send",MB_ICONSTOP); 
      else{ 
       // 把本地地址给套接字
    ChatSend.Bind(nProt,strAddr); 
      // strAddr="202.196.111.1" 
       // 开始侦听
       ChatSend.Listen(); 

       // 创建一个新的套接字并和他相连
       ChatSend.Accept(Server); 
      }
      //发送一个CString 对象
      Server.SendTo(csSendText,csCounts,nPort,strAddr); 

      // 关闭这两个套接字
      Server.Close(); 
      ChatSend.Close(); 

      (2)客户端程序流程

      // 套接字初始化
      if(!AfxSocketInit()){ 
       MessageBox("WindowsSocket initial failed!", "Receive",MB_ICONSTOP); 
       return; 
      }

      // 创建一个套接字对象
      CSocket ChatRecieve; 

      // 创建一个套接字
      if(!ChatReceive.Create()){ 
       MessageBox("ReceiveSocket create failed!","Receive",MB_ICONSTOP); 
       return; 
      }
      else{ 
       // 创建一个对等套接字
       ChatReceive.Connect(strAddr,nPort); 
      }

      //接受一个CString 对象
      ChatReceive.ReceiveFrom(csReceiveText,csCounts,strAddr,nPort); 

      // 关闭套接字
      ChatReceive.Close(); 

      上述两个进程完成的工作是:由Server 进程发送一字符串,Client 进程接收。 strAddr 和 nPort 的含义与方法1 中的相同 ;csSendText 和 csReceiveText 为发送与接收的字符串;csCounts为字串长度,这一长度在两个进程中要求接收长度小于或等于发送长度,否则会导致数据传输错误。另外,在程序中要加入头文件afxsock.h, CSocket 类的有关说明均在afxsock.h 中。 

    方法1 适合于对多个不同类型数据的通信,方法2 适合于对字符串的通信,具体选用何种方法则取决于具体应用的需求。  

    转载自:MFC网络编程学习

  • 相关阅读:
    11 Vue3 UI Framework Card 组件
    12 Vue3 UI Framework 打包发布
    15 Vue3 UI Framework 完工部署
    【译】使用 Visual Studio 调试外部源代码
    IntelliJ JSP 格式化问题
    JSP 学习笔记 | 五、MVC模式和三层架构 & JSP 案例实战
    JSP使用MySQL数据库报错java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    通过Navicate for MySQL导入SQL文件
    MAVEN 配置和基本使用
    JSP 学习笔记 | 二、JSP 脚本 & 案例实现 & 缺点分析
  • 原文地址:https://www.cnblogs.com/lit10050528/p/3662952.html
Copyright © 2011-2022 走看看