zoukankan      html  css  js  c++  java
  • CSocket客户端(TCP)

    首先是UDP和TCP的区别:

      UDP是不连接服务器,每次发送数据的时候需要服务器的IP;而TCP是先连接服务器,保持常连接,然后直接发送不需要IP。

    下面是TCP客户端:

    1、新建项目,TestCSocket。

    2、新建一个CSocket的派生类,CSockSon:CSocket。是因为只有CSocket的的虚函数OnReceive才可以在客户端上接收数据,而一个纯CSocket对象的OnReceive是空的,

      所以后面要重写此函数来处理接收数据。

    3、获得CSockSon的对象。

      在Dlg.h中定义一个CSockSon对象:public:CSockSon m_sock;

      首先需要在AppInit中初始化SOCKEt:AfxSocketInit();(为什么要初始化可以看Winapi,无非就是打包底层api函数);

      在连接按钮函数里:m_sock.Create();(这里可以不加参数,因为是TCP,所有参数在Connect里加入);

                 m_socku.Connect(CString("192.168.43.74"),8080);(然后连接到服务器IP,没写的参数都是缺省值,代表TCP)

      此时已经创建了一个连接到服务器的套接字对象。

    4、发送数据到服务器。

      m_sock.Send("123","123".GetLenth(),...);(反正TCP就是使用这个函数来发送数据,而UDP是使用SendTo,SendTo里制定了Ip)

    5、接收数据。

      首先在Dlg.cpp中增加一个方法,用于将从OnReceive中接收到的数据打印出来。

      void TestCSocket::OnReceive(LPCTSTR text)//注意两个OnReceive是不一样的,这个是自定义的,text是socket对象的OnReceive方法回调信息,代表接收数据

      {

      MessageBox(text);

      }

      接下来,需要在回调函数中将获取的数据传到上面那个函数里。在第二步中的派生类的CSockSon.cpp中重写虚函数OnReceive():

        void CSockU::OnReceive(int nErrorCode)
          {
          CString sziP;//用来存发来IP
          UINT nPort;//端口
          char s[512];//数据
          int rLen=ReceiveFrom(s,sizeof(s),sziP,nPort);//返回值,成功就返回接收长度
          s[rLen]=0;//是为了不出现乱码
          CTestCSocketDlg *pDlg= (CTestCSocketDlg*)AfxGetMainWnd();//获得主窗口的句柄,需要加入主窗口的头文件#include "TestCSocketDlg.h"
          pDlg->OnReceive(s);//调用自定义函数,把s传过去
          CSocket::OnReceive(nErrorCode);
          }

      注意:CWnd* AfxGetMainWnd( );

         使用AfxGetMainWnd函数获取MFC程序中的主框架类指针是一个常用作法。

    就是获得应用程序主窗口的指针,AfxGetMainWnd()-> m_hWnd是主窗口的句柄

    6、判断一个CSocket是否Create成功:m_socket.m_hSocket == INVALID_SOCKET

      

  • 相关阅读:
    angular.isDefined()
    angular.isDate()
    angular.isArray()
    .NET中栈和堆的比较
    SQL Server 2012配置Always On可用性组
    一分钟了解负载均衡的一切
    C# 线程并发锁
    获取Http请求参数
    什么是WCF
    Bitmap算法应用
  • 原文地址:https://www.cnblogs.com/judes/p/5896192.html
Copyright © 2011-2022 走看看