zoukankan      html  css  js  c++  java
  • MFC套接字编程

    为了降低网络程序开发的难度,提高程序开发效率,MFC对套接字函数进行了封装,提供了CAsyncSocket类和CSocket类用于网络程序开发。

    CAsyncSocket 类

    CAsyncSocket类用于对套接字函数进行简单封装,它提供了基于事件的I/O异步模型,使得用户可以方便地处理接收和发送等事件。但是,用户需要自己处理网络的字节顺序、不同字符集间的转换问题等。
    CAsyncSocket类的主要方法、事件如下:
    (1)Create方法
    该方法用于创建一个Windows套接字,并将其附加到CAsyncSocket类对象上。
    语法:
    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)
    nSocketPort 表示套接字端口,如果为0,系统将自动选择一个端口
    nSocketType表示套接字的类型,如果为SOCK_STREAM,表示流式套接字;为SOCK_DGRAM,表示数据包套接字
    lEvent 表示套接字能够处理的网络事件,其值可以是表20.18描述的任意值的组合
    lpszSocketAddress 表示套接字的IP地址
    FD_READ 当套接字中有数据需要读取时触发事件
    FD_WRITE 当向套接字写入数据时触发事件
    FD_OOB 当接收到带外数据时触发事件
    FD_ACCEPT 当接收到连接请求时触发事件
    FD_CONNECT 当连接完成时触发事件
    FD_CLOSE 当套接字关闭时触发事件
    (2)GetLastError方法
    该方法用于获取最后一次操作失败的状态信息。
    语法:
    static int GetLastError( );
    返回值:返回错误编号。
    (3)GetPeerName方法
    该方法用于获取套接字连接的IP地址信息。
    语法:
    BOOL GetPeerName( CString& rPeerAddress, UINT& rPeerPort );
    BOOL GetPeerName( SOCKADDR* lpSockAddr, int* lpSockAddrLen );
    rPeerAddress 用于接收函数返回的IP地址
    rPeerPort 用于记录端口号
    lpSockAddr 是一个sockaddr结构指针,用于记录套接字名称
    lpSockAddrLen 用于确定lpSockAddr的大小
    (4)Accept方法
    该方法用于接受客户端的连接。
    语法:
    virtual BOOL Accept( CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr = NULL, int*
    lpSockAddrLen = NULL );
     rConnectedSocket:对应当前连接的套接字引用。
     lpSockAddr:一个sockaddr结构指针,用于记录套接字地址。
     lpSockAddrLen:用于确定lpSockAddr的大小。
    (5)Bind方法
    该方法用于将IP地址和端口号绑定到套接字上。
    语法:
    BOOL Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL );
    BOOL Bind ( const SOCKADDR* lpSockAddr, int nSockAddrLen );
    nSocketPort 表示套接字端口
    lpszSocketAddress 表示IP地址
    lpSockAddr 表示一个sockaddr结构指针,该结构记录了套接字的地址信息
    nSockAddrLen 确定lpSockAddr的大小
    (6)Connect方法
    该方法用于发送一个连接请求。
    语法:
    BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort );
    BOOL Connect( const SOCKADDR* lpSockAddr, int nSockAddrLen );
    lpszHostAddress 表示主机的IP地址或网址
    nHostPort 表示主机的端口
    lpSockAddr 是一个sockaddr结构指针,该结构标识套接字地址信息
    nSockAddrLen 确定lpSockAddr的大小
    (7)Close方法
    该方法用于关闭套接字。
    语法:
    virtual void Close( );
    (8)Listen方法
    该方法用于将套接字置于监听模式。
    语法:
    BOOL Listen( int nConnectionBacklog = 5 );
    其中,nConnectionBacklog表示等待连接的最大队列长度。
    (9)Receive方法
    该方法用于在流式套接字中接收数据。
    语法:
    virtual int Receive( void* lpBuf, int nBufLen, int nFlags = 0 );
     lpBuf:接收数据的缓冲区。
     nBufLen:用于确定缓冲区的长度。
     nFlags:用于确定函数的调用模式。为MSG_PEEK,表示用来查看传来的数据,在序列前端的数据
    会被复制一份到返回缓冲区中,但是该数据不会从序列中移走;为MSG_OOB,表示处理带外数据。
    (10)ReceiveFrom方法
    该方法用于从数据包套接字中接收数据。
    语法:
    int ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 );
    int ReceiveFrom( void* lpBuf, int nBufLen, SOCKADDR* lpSockAddr, int* lpSockAddrLen, int nFlags = 0 );
    lpBuf 表示接收数据的缓冲区
    nBufLen 表示缓冲区的大小
    rSocketAddress 用于接收数据报的目的地(IP地址)
    rSocketPort 用于记录端口号
    lpSockAddr 是一个sockaddr结构指针,用于记录套接字地址信息
    lpSockAddrLen 确定lpSockAddr的大小
    nFlags 确定函数的调用模式,为MSG_PEEK,表示用来查看传来的数据,在序列前端的数据会被复制一份到返回缓冲区中,但是该            数据不会从序列中移走;为MSG_OOB,表示处理带外数据
    (11)Send方法
    该方法用于向流式套接字中发送数据。
    语法:
    virtual int Send( const void* lpBuf, int nBufLen, int nFlags = 0 );
     lpBuf:要发送数据的缓冲区。
     nBufLen:用于确定缓冲区的大小。
     nFlags:函数调用方法。
    (12)SendTo方法
    该方法用于在流式套接字或数据包套接字上发送数据。
    语法:
    int SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress=NULL, int nFlags = 0 );
    int SendTo( const void* lpBuf, int nBufLen, const SOCKADDR* lpSockAddr, int nSockAddrLen, int nFlags = 0 );
    lpBuf 表示要发送数据的缓冲区
    nBufLen 表示缓冲区大小
    nHostPort 表示主机端口号
    lpszHostAddress 表示主机地址
    lpSockAddr 表示一个sockaddr结构指针,用于确定主机套接字地址信息
    lpSockAddrLen 确定lpSockAddr的大小
    nFlags 表示函数调用方式
    (13)ShutDown方法
    该方法用于在套接字上断开数据的发送或接收。
    语法:
    BOOL ShutDown( int nHow = sends );
    其中,nHow用于确定ShutDown函数的行为,0表示不允许接收,1表示不允许发送,2表示不允许接收和发送。
    (14)OnAccept事件
    当套接字接受连接请求时触发该事件。
    语法:
    virtual void OnAccept( int nErrorCode );
    其中,nErrorCode表示错误代码。
    (15)OnClose事件
    当套接字关闭时触发该事件。
    语法:
    virtual void OnClose( int nErrorCode );
    其中,nErrorCode表示错误代码。
    (16)OnConnect事件
    当套接字连接之后触发该事件。
    语法:
    virtual void OnConnect( int nErrorCode);
    其中,nErrorCode表示错误代码。
    (17)OnReceive事件
    当套接字上有数据被接收时触发该事件。
    语法:
    virtual void OnReceive( int nErrorCode );
    其中,nErrorCode表示错误代码。
    (18)OnSend事件
    当套接字发送数据时触发该事件。
    语法:
    virtual void OnSend( int nErrorCode);
    其中,nErrorCode表示错误代码。





    版权声明:

  • 相关阅读:
    多种方式安装GitLabRunner
    rpm,docker,k8s三种方式安装部署GitLab服务
    利用curl命令访问Kubernetes API server
    在客户端电脑使用 kubectl 远程管理 Kubernetes
    利用 Nginx 反向代理搭建本地 yum 服务器
    Jenkins和Gitlab CI/CD自动更新k8s中pod使用的镜像说明
    1.在 Kubernetes 在快速安装 Harbor
    4.Gitlab CI 与 Kubernetes 的结合
    3.在 Kubernetes 上安装 Gitlab CI Runner
    2. 在 Kubernetes 上安装 Gitlab
  • 原文地址:https://www.cnblogs.com/walccott/p/4957071.html
Copyright © 2011-2022 走看看