【免杀前置课——Windows编程】十五、网络编程——C/S,B/S模式分别是什么?WinSocket、Socket传输的定义和其特点、实现简易通信(附代码)

news2024/11/13 19:25:05

网络编程

  • 网络编程
    • C/S:客户端/服务器模式:
    • B/S:浏览器/服务器架构模式。
    • WinSocket:
    • Socket传输的定义和其特点
    • 实现简易通信
      • 服务器端
      • 客户端

网络编程

网络分为C/S,B/S两种模式。

C/S:客户端/服务器模式:

服务器端:
首先服务器先启动,并根据客户端请求做出相应的响应。
1、打开一个通信通道,在某一端口接受客户端请求。
2、接受到客户端请求后处理请求并返回信息给客户端。
3、继续等待客户端请求直到关闭服务器。
客户端:
1、打开一个通信通道,并连接到服务器所在主机的特定端口。
2、向服务器发送请求,等待并接收响应,继续发送请求。
3、关闭客户端。

B/S:浏览器/服务器架构模式。

这种架构浏览器是客户端的主要应用软件,主要事物逻辑在服务器实现,前端(浏览器)负责展示。

WinSocket:

Windows Sockets规范是一套开放的、支持多协议的Windows下的网络编程接口。目前实际应用中的Windwos Sockets规范主要有1.1版本和2.2版本,其中1.1版本只支持TCP/IP协议,而2.2支持多协议,并具有良好的向后兼容性。这俩版本对应的头文件分别是: WinSocket.h WinSocket2.h

Socket传输的定义和其特点

所谓socket通常也称作“套接字”,实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议
Socket处于网络协议的传输层
TCP协议:TCP (Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂
UDP协议:UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;
在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段.

实现简易通信

服务器端

#include<WinSock2.h>
#include<Windows.h>
#include<iostream>
#include<ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#include<vector>
using std::vector;

vector<SOCKET> clientList;//保存多个线程的客户端
DWORD WINAPI revcMessage(LPVOID param)
{
	SOCKET client = (SOCKET)param;
	char buff[0x100]{ 0 };
	int recvSize = 0;
	while ((recvSize = recv(client,buff,0x100,0))>0)//接受消息的字节数判断是否大于0
	{
		for (int i = 0; i < clientList.size(); i++)//遍历进程中的每一个客户端线程
		{
			if (client != clientList[i])//判断是不是当前线程发的消息,若不是则发送给每个客户端
			{
				send(clientList[i], buff, recvSize, 0);
			}
		}
	}

	for (int i = 0; i < clientList.size(); i++)
	{
		if (clientList[i] == client)//判断哪一个客户端线程断开了连接
		{
			printf("客户端%u断开了连接\n", clientList[i]);
			closesocket(clientList[i]);
			clientList.erase(clientList.begin() + i);
		}
	}
	return 0;
}

int main()
{
	//1、初始化网络环境
	WSADATA data{ 0 };
	WSAStartup(MAKEWORD(2,2), &data);
	//2、创建Socket
	SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//用IPv4地址协议簇,TCP连接
	//3、指定IP地址和端口号
	sockaddr_in serverAddr{ 0 };
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons(7777);
	inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr);//InetPton函数将标准文本表示形式的 IPv4 或 IPv6 互联网网络地址转换为数字二进制形式
	//printf("%s\n", serverAddr.sin_addr);
	bind(server, (SOCKADDR*)&serverAddr, sizeof(serverAddr));//绑定函数将本地地址与套接字相关联。
	//4、监听
	listen(server, SOMAXCONN);
	//5、接受会话
	sockaddr_in clientAddr{ 0 };
	int size = sizeof(clientAddr);
	while (1)
	{
		//printf("等待客户端连接中......\n");
		SOCKET client = accept(server, (SOCKADDR*)&clientAddr, &size);//绑定将监听地址与套接字
		clientList.push_back(client);
		//创建线程实现并发通信
		CreateThread(NULL, NULL, revcMessage, (LPVOID)client, NULL, NULL);
		printf("客户端%u连接到了服务器\n",client);
		//char buff[0x100]{ 0 };
		//recv(client, buff, 0X100, 0); //recv函数从连接的套接字或绑定的无连接套接字接收数据
		//printf("client:%s\n", buff);
		//send(client, "有话说,没话走!", 16, 0);
	}
	closesocket(server);
	return 0;
}

客户端

#include<WinSock2.h>
#include<Windows.h>
#include<iostream>
#include<ws2tcpip.h>

#pragma comment(lib,"ws2_32.lib")

DWORD WINAPI revcMessage(LPVOID param)
{
	SOCKET client = (SOCKET)param;
	char buff[0x100]{ 0 };
	while (recv(client, buff, 0x100, 0) > 0)
	{
		printf("%s\n", buff);

	}
	return 0;
}

int main()
{
	//1、初始化网络环境
	WSADATA data{ 0 };
	WSAStartup(MAKEWORD(2, 2), &data);
	//2、创建Socket
	SOCKET client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//用IPv4地址协议簇,TCP连接
	//3、指定IP地址和端口号
	sockaddr_in serverAddr{ 0 };
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons(7777);
	inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr);//InetPton函数将标准文本表示形式的 IPv4 或 IPv6 互联网网络地址转换为数字二进制形式
	//4、连接
	int result = connect(client, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
	if (result)
	{
		printf("连接服务器失败\n");
	}
	HANDLE hThread = CreateThread(NULL, NULL, revcMessage, (LPVOID)client, NULL, NULL);
	char buff[0x100]{ 0 };
	while (scanf_s("%s",buff,0x100) && strcmp(buff,"exit"))//接受用户输入
	{
		send(client, buff, strlen(buff) + 1, 0);
	}
	closesocket(client);
	CloseHandle(hThread);
	/*send(client, "我有话说\n", 8, 0);
	char buff[0x100]{ 0 };
	recv(client, buff, 0x100, 0);
	printf("server:%s", buff);
	system("pause");*/
	return 0;
}




在这里插入图片描述
若不点击服务器端则一直等待客户端消息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Pytest 的高级用法之插件开发

用过pytest的小伙伴应该都知道&#xff0c;pytest之所以功能强大&#xff0c;是因为pytest的插件非常的多。这是插件大多是pytest的使用者所开发的&#xff0c;今天咱们专门来聊聊如何去自己开发Pytest的插件。 一 pytest插件的介绍 pytest框架采用的是插件系统的模式来设计的…

安装VMware

大纲&#xff1a; 一、VMware简介 VMWare虚拟机软件是一个“虚拟PC”软件&#xff0c;它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。 二、VMware摘要笔记 三、VMware安装步骤 1、将VMware Workstation 16 Pro解压后 双击运行第二个应用程序(player)进行…

精品基于springboot的线上跳蚤市场平台

《线上跳蚤市场平台》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;springboot(ssm) 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&a…

Android 中的权限

1、权限类型 Android 将权限分为不同的类型&#xff0c;包括安装时权限、运行时权限和特殊权限。每种权限类型都指明了当系统授予应用该权限后&#xff0c;应用可以访问的受限数据范围以及应用可以执行的受限操作范围。每项权限的保护级别取决于其类型。 1.1、安装时权限 安…

智慧农业发展,商业计划书撰写,商业模式,ppt亮点

目录 什么是商业模式 中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要_滚动新闻_中国政府网 第五篇 加快数字化发展 建设数字中国 第十五章 打造数字经济新优势 第十六章 加快数字社会建设步伐 第十七章 提高数字政府建设水平 第十八章 营造…

Linux下载安装 RabbitMQ​

压缩包&#xff1a;RabbitMQ-Linux版-Java文档类资源-CSDN下载 一、官网下载&#xff1a; 1、需要先下载RabbitMQ所需要的erl语言环境 官网地址&#xff1a;Downloads - Erlang/OTP 2、下载MQ 官网&#xff1a;Messaging that just works — RabbitMQgithub地址&#xff1a;…

一篇文章,教你彻底掌握接口测试!

Part 01、什么是接口测试 所谓接口&#xff0c;是指同一个系统中模块与模块间的数据传递接口、前后端交互、跨系统跨平台跨数据库的对接。而接口测试&#xff0c;则是通过接口的不同情况下的输入&#xff0c;去对比输出&#xff0c;看看是否满足接口规范所规定的功能、安全以及…

【设计模式】外观模式(Facade Pattern)

外观模式属于结构型模式&#xff0c;主要解决客户程序访问复杂程序中的多个子程序而产生的高耦合度及高复杂度问题&#xff0c;根本目的在于简化接口的调用。例如我们去医院看病&#xff0c;可能要去挂号、门诊、划价、取药&#xff08;子系统角色&#xff09;&#xff0c;这让…

Redis主从复制、哨兵模式、集群模式

文章目录一、Redis主从复制主从复制流程Redis主从复制的作用二、哨兵模式1、哨兵模式集群架构2、哨兵模式主要功能3、哨兵监控整个系统节点的过程4、主观下线5、客观下线6、master 选举7、故障迁移8、优点与缺点三、Cluster群集1、集群的作用2、Redis集群的数据分片四、实验一&…

Linux||使用vi编辑器按上下键输出字母

一、问题描述 在终端执行sudo命令时&#xff0c;系统提示“vboxuser is not in the sudoers file.This incident will be reported”&#xff0c;因此需要修改/etc/sudoers文件。 使用Linux自带的vi编辑器修改/etc/sudoers文件时候&#xff0c;按i键进入编辑模式。使用键盘上下…

SD-Branch多分支组网解决方案

一、多分支组网建设背景 多分支一般是指行政上由总部和分支单位组成&#xff0c;总部和各分支处在地域不同的区域&#xff1b;由于业务访问需要&#xff0c;组网要求“总部-分支”互联打通。多分支网络组网方案主要针对的是总分企业、金融网点、连锁酒店、连锁门店、商超地产、…

组合预测 | MATLAB实现基于BP-Adaboost强分类器多特征分类预测

组合预测 | MATLAB实现基于BP-Adaboost强分类器多特征分类预测 目录 组合预测 | MATLAB实现基于BP-Adaboost强分类器多特征分类预测预测效果基本介绍模型特性程序设计参考资料预测效果 基本介绍 MATLAB实现基于BP-Adaboost强分类器多特征分类预测。在集成学习-Boosting,Bagging…

如何建立公司网站?【公司网站建设】

现在很多实体公司企业都会做一个自己的公司网站&#xff0c;毕竟一个网站等同于一张在互联网中的名片&#xff0c;可以让更多客户了解到你。那么如何建立公司网站&#xff1f;流程步骤大概是什么&#xff1f;今天给大家简单讲解一下。 一、注册域名 这个域名是就是网址&#…

学编程:Python入门考级必备[8]

目录 知识模块(8) 列表知识——井然有序 1.列表的创建 2.列表访问(查找操作) 3.列表增加操作 4.列表删除操作 5.统计与计算 附件代码&#xff1a; 炼 知识模块(8) 列表知识——井然有序 知识模块(8) 列表知识——井然有序 1.列表的创建 1.1 空列表&#xff1a; lie …

[Linux](16)网络编程:网络概述,网络基本原理,套接字,UDP,TCP,并发服务器编程,守护(精灵)进程

文章目录网络协议初识OSI 七层模型TCP/IP 四层(或五层)模型IP、MAC、端口号TCP 协议与 UDP 协议套接字套接字地址结构socket 函数bind 函数recvfrom 函数sendto 函数UDP 通信实现服务端客户端TCP 通信实现服务端listen 函数accept 函数实现客户端connect 函数实现改进&#xff…

项目中集成高德地图

如果文章对你有帮助欢迎【关注❤️❤️❤️点赞&#x1f44d;&#x1f44d;&#x1f44d;收藏⭐⭐⭐】一键三连&#xff01;一起努力&#xff01; 本文我们主要讲述的是怎么在自己的项目中集成高德地图。 一、注册账号并申请Key 首先我们打开浏览器&#xff0c;直接百度&…

python小知识--创建scrapy工程步骤

python小知识--创建scrapy工程步骤前言python中的scrapy框架是我们在平时使用爬虫使用比较多的框架首先第一步就是创建scrapy工程&#xff0c;下面通过pycharm软件来演示效果图1、右击文件名称选择open in terminal打开终端cmd2、在终端控制台输入scrapy startproject kuaikank…

grafana alert告警面板配置说明

grafana alert告警面板配置说明 前提&#xff1a;只有graph panel 也就是图表面板&#xff08;一般都是折线图和柱状图或者点状图&#xff09;可以添加Alert &#xff0c;其他面板不支持。 Rule Name &#xff1a;Alert规则 的名称 每多少时间评估一次 如果配置了这个参数&…

安卓APP源码和设计报告——基于Android的垃圾分类系统

《移动应用开发》大作业报告 题 目基于Android的垃圾分类系统系 部班 级学 生 姓 名学 号指 导 教 师时 间 1、项目名称 垃圾分类系统 2、项目概述 近些年&#xff0c;由于人民生活水平是的提高&#xff0c;生活方式与生活节奏的加快&#xff0c;使我国的垃圾生产数量已远超…

Flink系列之Flink之Time和WaterMark深入剖析

title: Flink系列 一、Flink Window 常见需求背景 1.0 理论描述 需求描述&#xff1a; 每隔 5 秒&#xff0c;计算最近 10 秒单词出现的次数。 滑动窗口 每隔 5 秒&#xff0c;计算最近 5 秒单词出现的次数。 滚动窗口 第一个&#xff1a; 关于 TimeCharacteristic Process…