【MFC】网络通信(23)

news2024/11/17 1:56:11

Windows Sockets 规范是 Windows 平台下定义的可以兼容二进制数据传输的网络编程接口,是基于伯克利加利福尼亚大学的 BSD UNIX Sockets 的实现。

Socket 套接字分为两种类型:数据报 socket 和数据流 socket。

数据报套接字,即无连接套接字,不保证传输的可靠性,比如视频通信、时钟同步、与服务器的“心跳”同步等应用场景。

数据流套接字是基于显示连接的套接字,提供没有记录边界的双向字节数据流,具有可靠的发送顺序,适用大量数据且可靠性要求高的传输。

CSocket实现数据流网络通信

步骤:

1、创建服务器通信程序: 

 在高级功能中勾选Widows套接字,否则需要手动包含套接字的头文件

#include <afxsock.h>
并且在应用程序类的InitInsatnce函数中初始化套接字:

BOOL CSockServerApp::InitInstance()
{
   .......
	CWinApp::InitInstance();

	if (!AfxSocketInit())  //手动添加初始化套接字
	{
		
		return FALSE;
	}
   ......
}

2、与服务器一样创建客户端程序(略),其中可以把两个项目都方在同一个解决方案里,如:

 

3、分别给服务器和客户端添加CSocket的派生类

利用类向导,添加虚函数 OnReceive 用于测试服务器发送数据给客户端

 

自动生成的代码 头文件:

#pragma once

// CClientSocket 命令目标

class CClientSocket : public CSocket
{
public:
	CClientSocket();
	virtual ~CClientSocket();
	virtual void OnReceive(int nErrorCode);
};

源文件:

// ClientSocket.cpp : 实现文件
//

#include "stdafx.h"
#include "TestSockClient.h"
#include "ClientSocket.h"


// CClientSocket

CClientSocket::CClientSocket()
{
}

CClientSocket::~CClientSocket()
{
}


// CClientSocket 成员函数


void CClientSocket::OnReceive(int nErrorCode)
{
	// TODO: 在此添加专用代码和/或调用基类

	CSocket::OnReceive(nErrorCode);
}

同样的方法创建服务器的套接字,不同之处,比客户端多添加一个OnAccept的虚函数:

头文件:

#pragma once

// CServerSocket 命令目标

class CServerSocket : public CSocket
{
public:
	CServerSocket();
	virtual ~CServerSocket();
	virtual void OnReceive(int nErrorCode);
	virtual void OnAccept(int nErrorCode);
};

源文件:

// ServerSocket.cpp : 实现文件
//

#include "stdafx.h"
#include "TestSockServer.h"
#include "ServerSocket.h"


// CServerSocket

CServerSocket::CServerSocket()
{
}

CServerSocket::~CServerSocket()
{
}


// CServerSocket 成员函数


void CServerSocket::OnReceive(int nErrorCode)
{
	// TODO: 在此添加专用代码和/或调用基类	
	CSocket::OnReceive(nErrorCode);
}


void CServerSocket::OnAccept(int nErrorCode)
{
	// TODO: 在此添加专用代码和/或调用基类	
	CSocket::OnAccept(nErrorCode);
}

4、网络通信的流程其实很简单:

服务端:创建套接字-》侦听         侦听套接字

客户端:创建套接字-》连接服务器-》服务端侦听套接字获取连接事件(OnAccept)

服务端处理连接事件:创建一个 通信套接字 与客户端进行网络通信 ,也就是说服务端有一个侦听套接字和可能多个通信套接字。 

网络通信:客户端发送消息(Send),服务端中负责与客户端通信的套接字(OnReceive),通过Receive函数获取消息内容,完成通信。

创建套接字:

CServerSocket s;  //应该定义在主窗口类中

//创建套接字和侦听可以放在对话框的  OnInitDialog  函数中
s.Create(8000);  // 8000是服务器的端口  第二个参数默认为流式套接字,第三个参数为IP,默认本机
s.Listen(5); // 侦听队列,超过等待连接数据会阻塞

客户端套接字完成创建即可,注意要绑定在服务器端口(8000)不同的端口上。

CClientSocket c;    //应该定义在主窗口类中

//创建套接字可以放在对话框的  OnInitDialog  函数中
c.Create(8001);

//连接和发送消息的功能可以放于按钮点击事件处理中

c.Connect("127.0.0.1",8000); // 连接到服务器 127.0.0.1 本机IP
char buff[256]="hello";  //测试数据
c.Send(buff,strlen(buff)); // 发送数据到服务器

服务端套接字 OnAccept 函数,侦听和与客户端通信的套接字可以使用同一个类

void CServerSocket::OnAccept(int nErrorCode)
{
	// TODO: 在此添加专用代码和/或调用基类
	
	CServerSocket *p = new CServerSocket();
	this->Accept(*p);
	CSocket::OnAccept(nErrorCode);
}

new 一个通信套接字(不能为对象,局部对象会被销毁),与客户端进行连接。这是一种最简单的测试方法,有点类似“内存泄漏”----------new 在堆里,而定义的指针 p 是一个局部变量!

“内存泄漏”  : 服务端收到客户端信息时, OnReceive 会被调用,堆中的通信套接字又可以获取到了。

void CServerSocket::OnReceive(int nErrorCode)
{
	// TODO: 在此添加专用代码和/或调用基类
	char buff[256];
	int size = this->Receive(buff,256);    
    // this 为服务端的通信套接字,又“冒”出来了
    //size为实际接受的数据
	buff[size]='\0';  //字符串结束符
	::AfxMessageBox(buff);
	CSocket::OnReceive(nErrorCode);
}

5、改进与提升方向

  • 使用多线程(窗口线程)与通信套接字绑定来实现网络通信,尤其是服务端。
  • CSocketFile 的Write 、Read  来代替 套接字 Send 和 Receive ,实现大数据的通信
  • “安全”数据报方式实现客户端的互连(不通过服务器转发)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络通信基础 - 多路复用技术(频分多路复用、时分多路复用、波分多路复用)

文章目录 1 概述1.1 复用器 MUX 2 分类2.1 频分多路复用 FDM2.2 时分多路复用 TDM2.3 波分多路复用 WDM 1 概述 1.1 复用器 MUX 多路复用技术&#xff1a;把多个低速信道组合成一个高速信道的技术这种技术要用到两个设备&#xff0c;统称为 多路器&#xff08;MUX&#xff09…

Chapter13-基于 Netty 的通信实现

13.l Netty 介绍 Netty 是一个网络应用框架&#xff0c;或者说是一个 Java 网络开发库。 Netty 提供异步事件驱动的方式&#xff0c;使用它可以快速地开发出高性能的网络应用程序&#xff0c;比如客户端&#xff0f;服务器自定义协议程序&#xff0c;大大简化了网络程序的开发过…

ParticleSystem中的Culling Mode对耗时有怎样的影响

1&#xff09;ParticleSystem中的Culling Mode对耗时有怎样的影响 ​2&#xff09;关于API&#xff0c;OpenGL和Vulkan的疑问 3&#xff09;SVC分别搜集Keyword&#xff0c;多次搜集与单独搜集Warmup内存比较 4&#xff09;Occlusion Culling能否降低Culling耗时 这是第332篇UW…

kaggle酶稳定性预测第三名解决方案分享

最近在kaggle参加了诺维信举办的酶稳定性预测比赛 &#xff0c;最终很幸运获得了第三名&#xff0c;这篇文章主要是简单介绍一下解决方案&#xff0c;具体的数据和题目要求可访问上面的链接。 文章目录 模型概述特征工程模型XGB1XGB2XGB3 EnsembleNESP 3D geometryFoldXThermo…

AI即将夺走程序员的工作?实操验证

随着ChatGPT的普及&#xff0c;许多媒体开始报道“AI即将夺走程序员的工作”、“AI来了&#xff01;各大长都开始大幅度裁员”&#xff0c;这让一些初级码农感到担忧&#xff0c;而一些高级程序员则表示不屑一顾。这到底是不是“狼来了”。今天&#xff0c;我们将进行实际测试来…

实例了解GOT,PLT和动态链接

深入了解GOT,PLT和动态链接 我们使用一个简单的例子来了解动态链接库的链接过程&#xff0c;以及在这个过程中使用到的GOT和PLT的作用是什么。 文件准备 代码结构如下所示&#xff1a; [rootlocalhost test]# tree . . ├── main.c └── symbol.csymbol.c的内容如下&am…

聊聊布隆过滤器

目录 一、什么是布隆过滤器&#xff1f; 二、使用场景 三、原理 四、使用 4.1、Guava实现 4.2、Redisson实现 一、什么是布隆过滤器&#xff1f; 布隆过滤器&#xff08;英语&#xff1a;Bloom Filter&#xff09;是1970年由布隆提出的&#xff0c;是一种数据结构。它实际…

推式配货(Push)、拉式配货(Pull)和配送需求计划(DRP)的区别

随着电子商务的迅猛发展&#xff0c;物流配送服务已然成为企业竞争最为核心的环节&#xff0c;一个全面、完善的物流配送方案&#xff0c;能够帮助企业满足客户交期、节约运输和库存成本&#xff0c;促进各环节沟通&#xff0c;提高生产稳定性。同时&#xff0c;物流配送的许多…

如何在Java中高效地实现数字的反转和字符串的拼接?

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

2023爱分析·工业互联网解决方案-设备后市场服务市场厂商评估报告

01 研究范围定义 “十四五”期间工信部等发布《“十四五”智能制造发展规划》&#xff0c;强调智能制造是我国制造强国主攻方向&#xff0c;加快推动智能制造发展&#xff0c;深化智能推广应用&#xff0c;开拓制造业数字化转型升级新路径&#xff0c;智能制造市场发展潜力进…

Pyqt应用相关之与Excel的联接

利用所学相关Pyqt实现对于Excel文件内部数据的处理&#xff0c;首先需要获取Excel的数据&#xff0c;在获取后进行保存处理即可完成相应的操作。 def save_data_btn_click(self):dir self.save_dir_text.text().strip()self.data_frame_group.to_excel(dir output.xlsx,sheet…

IMX6ULLPRO交叉编译第一个APP和第一个led驱动

目录 配置交叉编译工具链 永久生效 测试交叉编译工具链 第一个交叉编译程序 开发板运行 LED第一个驱动 开发板下操作 执行测试程序 配置交叉编译工具链 交叉编译工具链用来在 Ubuntu 主机上编译应用程序&#xff0c;而这些应用程序是在 ARM 等其他平台上运行…

GPT对SaaS领域有什么影响?

GPT火了&#xff0c;Chat GPT真的火了。 突然之间&#xff0c;所有人都在讨论AI&#xff0c;最初的访客是程序员、工程师、AI从业者&#xff0c;从早高峰写字楼电梯里讨论声&#xff0c;到村里大爷们的饭后谈资&#xff0c;路过的狗子都要和它讨论两句GPT的程度。 革命的前夜…

图像配准(匹配)与变化检测

文章目录 简介A Survey on Deep Learning-Based Change Detection from High-Resolution Remote Sensing Images 2022变化检测的基本框架基于神经网络的变化检测特征抽取变化检测的粒度场景级的变化检测&#xff08;SLCD&#xff09;目标级别的变化检测 Deep Learning-Based Ch…

全志v851s uart3 设置成普通串口收发

本文转载自&#xff1a;https://bbs.aw-ol.com/topic/3281/ 由于UART0 被设定为系统dubug 输出&#xff08;简单来说就是将ttyS0 设定为console&#xff09;&#xff0c;所以使用UART3 作为普通的串口&#xff0c;进行与别的设备通信。 1. 查看硬件电路图SCH_Schematic1_2022…

安全防御 --- APT、密码学

APT 深度包检测技术&#xff1a;将应用层内容展开进行分析&#xff0c;根据不同的设定从而做出不同的安全产品。 深度流检测技术&#xff1a;与APS画像类似。会记录正常流量行为&#xff0c;也会将某些应用的行为画像描述出来。也可将加密流量进行判断&#xff0c;并执行相应措…

揭秘移动云大会展区前沿科技

2023年4月25日-26日 我们苏州金鸡湖国际会议中心见&#xff01; 1场重磅主论坛、10场分论坛、2600㎡展区 数字中国新未来 尽在2023移动云大会 2023移动云大会设有中国移动和合作伙伴两大展区&#xff0c;联合40余家优质合作伙伴&#xff0c;全方位展示移动云在自主能力、行…

实验05:算法设计策略的比较与选择

1.实验目的&#xff1a; 比较同一问题&#xff0c;采用不同策略设计不同算法&#xff0c;分析和比较算法的性能。 2.实验内容&#xff1a; 自学第10章的10.1.1至10.1.3, 总结分析编程实现简单算法、分治法和动态规划算法的理论复杂度&#xff0c;编程实现这些算法。 3.实验…

C语言复习之顺序表(十五)

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c阶段>——目标C、Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&#xff0c;会持续分享…