博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CSocket客户端(TCP)
阅读量:4880 次
发布时间:2019-06-11

本文共 1564 字,大约阅读时间需要 5 分钟。

首先是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

  

转载于:https://www.cnblogs.com/judes/p/5896192.html

你可能感兴趣的文章
Java Web学习脑图
查看>>
LLVM的总结
查看>>
Android 开发中 iBeacon的使用
查看>>
Android应用程序组件Content Provider应用实例
查看>>
Akka(11): 分布式运算:集群-均衡负载
查看>>
Java学习笔记day05_方法重载
查看>>
【02】程序员不可不知的版权协议
查看>>
什么是SpringMvc
查看>>
记一个数据库游标的实例
查看>>
netcore2.0 ORM框架中如何配置自定义的主外键加载
查看>>
基础练习 十进制转十六进制
查看>>
156 合并区间
查看>>
C# Base64加密解密
查看>>
HDU 1255 覆盖的面积 线段树+扫描线
查看>>
关联映射 ---- Hibernate之多对多关系
查看>>
System.ArgumentException: 另一个SqlParameterCollection中已包含SqlParameter。
查看>>
【1】自定义WindowsForm分页控件使用【共两篇】
查看>>
堆的插入删除
查看>>
期末大作业
查看>>
[转载] C++ 类中的类成员变量怎么调用带参数的构造函数来初始化?
查看>>