zoukankan      html  css  js  c++  java
  • 基于消息的异步套接字

    首先加载套接字库

    #include  <winsock2.h> //套接字库头文件

    还需要为工程添加连接ws2_32.lib

    WORD wVersionRequested;

    WSADATA wsaData;

    int err;

    wVersionRequested = MAKEWORD(2,2);

    err = WSAStartup(wVersionRequested,&wsaData);

    if(err != 0)

    {

      return FALSE;

    }

    if(LOBYTE(wsaData.wVersion) != 2 ||

      HIBYTE(wsaData.wVersion) !=2)

    {

      WSACleanup();

      return FALSE;

    }

    创建并初始化套接字

    BOOL ::InitSocket

    {

      m_socket = WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0); //m_scoket为SCOKET类型在头文件中定义

      if(INVALID_SOCKET == m_socket)

      {

        AfxMessagebox("创建套接字失败!");

        return;

      }

      SOCKADDR_IN addrSock;

      addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //htonl 将u_long从主机字节顺序转换为TCP/IP网络字节顺序

      addrSock.sin_family = AF_INET;

      addrSock.sin_port = htons(6000); //htons 将u_short从主机字节顺序转换为TCP/IP网络字节顺序

      if(SOCKET_ERROR == bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))

      {  

        AfxMessageBox("绑定失败! ");

        return FALSE;

      }

      if(SOCKET_ERROR == WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_READ))  //UM_SOCK自定义消息,m_hWnd对话框窗口句柄

      {

        AfxMessageBox("注册网络读取时间失败!");

        return FALSE;

      }

      return TRUE;

    }

    实现接收端功能

    添加消息响应函数

    #define UM_SOCK WM_USER+1

    afx_msg void OnSock(WPARAM,LPARAM);

    ON_MESSAGE(UM_SOCK,OnSock)

    void ::OnSock(WPARAM wParam,LPARAM lParam)

    {

      switch(LOWORD(lParam))

      {

        case FD_READ:

          WSABUF wsabuf;

          wsabuf.buf = new char[200];

          wsabuf.len = 200;

          DWORD dwRead;

          DWORD dwFlag = 0;

          SOCKADDR_IN = addrFrom;

          int len = sizeof(SOCKADDR);

          CString strl;

          CString strTemp;

          if(SOCKET_ERROR == WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,

            (SOCKADDR*)&addrFrom,&len,NULL,NULL)

          {

            AfxMessageBox("接收数据失败!");

            delete[] wsabuf.buf;

            return;

          }

      }

    }

     实现发送端功能

    void ::OnBtnSend()

    {

      DWORD dwIP;

      CString strSend;

      WSABUF wsabuf;

      DWORD dwSend;

      int len;

      SOCKADDR_IN addrTo;

      

      ((CIPAddressCtrl*)GetDlgItem(IDC_IPASSRESS1))->GetAddress(dwIP); //IDC_IPASSRESS1 ,IP控件的ID

      addrTo.sin_addr.S_un.S_addr = htonl(dwIP);

      addrTo.sin_family = AF_INET;

      addrTo.sin_port = htons(6000);

      GetDlgItemText(IDC_EDIT_SEND,strSend);  //发送数据EDIT的ID

      len = strSend.GetLength();

      wsabuf.buf = strSend.GetBuffer(len);

      wsabuf.len = len + 1;

      if(SOCKET_ERROR == WSASendTo(m_socket,&wsabuf,1,&dwSend,0,

      SetDlgItemText(IDC_EDIT_SEND,""); //清空发送编辑框

        (SOCKADDR*)&addrTo,sizeof(SOCKADDR),NULL,NULL))

      {

        AfxMessageBox("是、发送数据失败!");

        return;

      }

      

    }

    终止套接字库的使用

    WSACleanup();

    关闭套接字

    closesocket(m_socket);

  • 相关阅读:
    java kafka单列模式生产者客户端
    手机视频加手机壳小软件
    Jetbrains系列产品(Pycharm IDEA)2020.1及以下版本最新安装方法
    快速解决网页不能复制问题
    MATLAB 2018a软件安装教程
    有哪些超级良心的电脑软件,让你相见恨晚?
    SPSS 25安装资源及其安装教程!!
    SPSS 25 Mac版安装资源及其安装教程!!
    IDE | Pycharm 2020.1.3 安装教程
    MATLAB 2018a软件安装教程
  • 原文地址:https://www.cnblogs.com/pbreak/p/1752333.html
Copyright © 2011-2022 走看看