自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(396)
  • 收藏
  • 关注

原创 网络编程——实现HTTP服务器端

参考《TCP/IP网络编程》 尹圣雨Web服务器端概述Web服务器端是,基于HTTP(Hypertext Transfer Protocol)协议,将网页对应文件传输给客户端的服务器端。Hypertext(超文本)是可以根据客户端请求而跳转的结构化信息。HTTP协议是以超文本传输为目的而设计的应用层协议,同样基于TCP/IP实现。浏览器属于基于套接字的客户端,因为连接到任意Web服务器端时,浏览器内部也会创建套接字。只是浏览器将服务器端传输的HTML格式的超文本解析为可读性较强的视图。H

2022-05-06 21:14:01 2489

原创 网络编程——IOCP

参考《TCP/IP网络编程》 尹圣雨IOCPIOCP(Input Output Completion Port,输入输出完成端口)是性能最好的Windows平台I/O模型。Linux有epoll,BSD有kqueue。从重叠I/O理解IOCP实现非阻塞模式的套接字在Windows中通过ioctlsocket函数将套接字属性改为非阻塞式,其调用的含义是,将hLisnSock句柄引用的套接字I/O模式(FIONBIO)改为变量mode中指定的形式SOCKET hLisnSock;int mo

2022-05-05 21:14:09 2039

原创 网络编程——重叠I/O模型

参考《TCP/IP网络编程》 尹圣雨重叠I/O模型理解重叠I/O模型同一线程内部向多个目标传输(或从多个目标接收)数据引起的I/O重叠现象称为“重叠I/O”。为了完成这项任务,调用的I/O函数应立即返回,因此前提条件是异步I/O。而且,为了完成异步I/O,调用的I/O函数应以非阻塞模式工作Windows中重叠I/O的重点并非I/O本身,而是如何确认I/O完成时的状态创建重叠I/O套接字#include <winsock2.h>SOCKET WSASocket(int af,

2022-05-05 12:33:30 2652 1

原创 网络编程——异步通知I/O模型

参考《TCP/IP网络编程》 尹圣雨异步通知I/O模型异步I/O同步I/O的缺点:进行I/O的过程中函数无法返回,所以不能执行其他任务异步I/O是指I/O函数的返回时刻与数据收发的完成时刻不一致,是为了克服同步I/O的缺点而设计的模型。无论数据是否完成交互都返回函数,这就意味着可以执行其他任务,能够更有效地使用CPU理解异步通知I/O模型异步通知I/O模型,意为“通知I/O”以异步方式工作通知I/O指发生了I/O相关的特定情况,即通知输入缓冲收到数据并需要读取,以及输出缓冲为空可以发送数

2022-05-04 19:26:13 581

原创 网络编程——Windows中的线程同步

参考《TCP/IP网络编程》 尹圣雨Windows中的线程同步用户模式和内核模式用户模式:运行应用程序的基本模式,禁止访问物理设备,而且会限制访问的内存区域内核模式:操作系统运行时的模式,不仅不会限制访问的内存区域,而且访问的硬件设备也不会受限内核是操作系统的核心模块,可以简单定义为:用户模式:应用程序的运行模式内核模式:操作系统的运行模式在应用程序运行过程中,Windows操作系统会在用户模式和内核模式之间切换。例如,在Windows中创建线程,虽然创建线程的请求是由应用程序的函

2022-05-04 17:00:12 780

原创 网络编程——Windows中的线程

参考《TCP/IP网络编程》 尹圣雨Windows中的线程内核对象操作系统创建的资源,如进程、线程、文件、信号量、互斥量等。这些资源的共同点是,都是由Windows操作系统创建并管理的的资源。不同资源的管理方式有差异,操作系统为了以记录相关信息的方式管理各种资源,在其内部生成数据块。由于每种资源需要维护的信息不同,所以每种资源拥有的数据块格式也有差异。这类数据块称为“内核对象”。内核对象的所有者是内核(操作系统)。内核对象的创建、管理、销毁时机的决定等工作均由操作系统完成线程调用main函

2022-05-02 18:02:58 1098

原创 网络编程——多线程服务器端的实现

参考《TCP/IP网络编程》 尹圣雨多线程服务器端的实现线程和线程创建进程(复制)的工作本身会给操作系统带来相当沉重的负担。而且,每个进程具有独立的内存空间,所以进程间通信的实现难度也会随之提高。多进程模型的缺点:创建进程的过程会带来一定的开销为了完成进程间数据交换,需要特殊的IPC(Inter-Process Communication)技术频繁的上下文切换(Context Switching)是创建进程时最大的开销为了保持多进程的优点,并一定程度上克服其缺点,引入了线程。线程的

2022-04-28 19:44:20 703

原创 网络编程——epoll

参考《TCP/IP网络编程》 尹圣雨epollepoll也是Linux下实现I/O复用的一种方法,其性能优于select。基于select的I/O复用服务器的设计缺陷调用select函数后,针对所有文件描述符的循环语句。调用select函数后,需要观察作为监视对象的fd_set变量的变化,找出变化的文件描述符,因此需要针对所有监视对象的循环语句。作为fd_set变量会发生变化,调用select函数前需要复制并保存原有信息,并在每次调用select函数时传递新的监视对象。其中,第

2022-04-16 14:31:29 4091

原创 网络编程——分离I/O流

参考《TCP/IP网络编程》 尹圣雨分离I/O流两种I/O流分离第一种是TCP I/O过程分离。这种方法通过调用fork函数复制出1个文件描述符,以区分输入和输出中使用的文件描述符。虽然文件描述符本身不会根据输入和输出进行区分,但分开了2个文件描述符的用途,因此也属于流的分离。第二种是使用标准I/O函数时,通过2次fdopen函数的调用,创建读模式FILE指针和写模式FILE指针,分离了输入工具和输出工具,也可以视为流的分离。分离流的好处第一种分离流的方式的好处:通过分开输入过程(代码

2022-03-27 14:57:21 3575

原创 网络编程——标准I/O函数

参考《TCP/IP网络编程》 尹圣雨标准I/O函数除了默认数据通信手段read和write函数及各种系统I/O函数,还可以使用C语言中的标准I/O函数标准I/O函数的优点(1)标准I/O函数具有良好的移植性为了支持所有操作系统(编译器),标准函数都是按照ANSI C标准定义的,具有良好的移植性(2)标准I/O函数可以利用缓冲提高性能使用标准I/O函数会得到额外的缓冲支持。创建套接字时,操作系统将生成用于I/O的缓冲,此缓冲在执行TCP协议时发挥着非常重要的作用。若使用标准I/O函数,将得

2022-03-27 13:56:19 615

原创 网络编程——多播与广播

参考《TCP/IP网络编程》 尹圣雨多播与广播多播多播(Multicast)方式的数据传输是基于UDP完成的。与UDP服务器端/客户端的实现方式区别在于,UDP数据传输以单一目标进行,而多播数据同时传递传递到加入(注册)特定组的大量主机MBone(Multicast Backbone,多播主干网)多播是基于MBone这个虚拟网络工作的。虚拟网络可以理解为通过网络中的特殊协议工作的软件概念上的网络。即MBone并非可以触及的物理网络。它是以物理网络为基础,通过软件方法实现的多播通信必备虚拟网络

2021-11-11 12:53:48 2421

原创 网络编程——多种I/O函数

参考《TCP/IP网络编程》 尹圣雨多种I/O函数send和recv函数Linux中的send和recv(1)send#include <sys/socket.h>ssize_t send(int sockfd, const void* buf, size_t nbytes, int flags);成功时返回发送的字节数,失败时返回-1sockfd:表示与数据传输对象的连接的套接字文件描述符buf:保存待传输数据的缓冲地址值nbytes:待传输的字节数flags

2021-11-05 17:13:05 344 1

原创 网络编程——I/O复用

参考《TCP/IP网络编程》 尹圣雨I/O复用多进程服务器端的缺点多进程服务器端,只要有客户端连接请求就会创建新进程。但创建进程时需要付出极大代价。这需要大量的运算和内存空间,由于每个进程都具有独立的内存空间,所以相互间的数据交换也要求采用相对复杂的方法select函数使用select函数时可以将多个文件描述符集中到一起统一监视(监视项称为事件):是否存在套接字接收数据?无需阻塞传输数据的套接字有哪些?哪些套接字发生了异常?select函数的调用方法:(1)步骤一:设置文件

2021-11-03 16:59:21 254

原创 网络编程——进程间通信

参考《TCP/IP网络编程》 尹圣雨进程间通信进程间通信(Inter Process Communication)意味着两个不同进程间可以交换数据,为了完成这一点,操作系统中应提供两个进程可以同时访问的内存空间通过管道实现进程间通信为了完成进程间通信,需要创建管道。管道并非属于进程的资源,而是和套接字一样,属于操作系统(即不是fork函数的复制对象)。所以,两个进程通过操作系统提供的内存空间进行通信#include <unistd.h>int pipe(int filedes

2021-11-01 01:07:45 495

原创 网络编程——多进程服务器端

参考《TCP/IP网络编程》多进程服务器端具有代表性的并发服务器端实现模型和方法:多进程服务器:通过创建多个进程提供服务多路复用服务器:通过捆绑并同一管理I/O对象提供服务多线程服务器:通过生成与客户端等量的线程提供服务多进程服务器不适合在Windows平台下进程进程的定义:占用内存空间的正在运行的程序。进程ID所有进程都会从操作系统分配到ID。此ID称为进程ID,其值为大于2的整数。1要分配给操作系统启动后的(用于协助操作系统)首个进程,因此用户进程无法得到ID值1fork

2021-11-01 01:05:56 562

原创 网络编程——套接字的多种可选项

参考《TCP/IP网络编程》 尹圣雨套接字多种可选项上表中列出了一部分套接字可选项。IPPROTO_IP层可选项是IP协议相关事项,IPPROTO_TCP层可选项是TCP协议相关事项,SOL_SOCKET层是套接字相关的通用可选项对可选项进行读取(Get)#include <sys/socket.h>int getsockopt(int sock, int level, int optname, void* optval, socklen_t* optlen);成功时返回

2021-10-28 23:20:17 1297 1

原创 网络编程——域名及网络地址

参考《TCP/IP网络编程》 尹圣雨域名及网络地址域名系统DNS是对IP地址和域名进行相互转换的系统,其核心是DNS服务器域名提供网络服务的服务器端是IP地址区分的,将容易记、易表述的域名分配并取代IP地址DNS服务器域名是赋予服务器的虚拟地址,域名服务器将虚拟地址转化为实际地址。所有计算机中都记录着默认DNS服务器地址计算机内置的默认DNS服务器并不知道网络上所有域名的IP地址信息。若该DNS服务器无法解析,则会询问其他DNS服务器,并提供给用户(https://blog.csdn.

2021-10-27 15:32:58 258

原创 网络编程——TCP的半关闭

参考《TCP/IP网络编程》 尹圣雨TCP的半关闭一旦两台主机间建立了套接字连接,每个主机就会拥有单独的输入流和输出流。其中一个主机的输入流与另一主机的输出流相连,而输出流则与另一主机的输入流相连Linux的close函数和Windows的closesocket函数会同时断开两个流。即主机无法传输数据,也无法接收数据。导致另一台主机正在发送的数据无法再接收了。因此,我们需要半关闭状态,只关闭其中的一个流假设服务器端想半关闭自己的输出流,一方面需要让客户端知道数据已经传输完毕,另一方面要保留输入

2021-10-26 16:21:23 1353

原创 C++入门——实现“火柴人跑酷”游戏

参考《C和C++游戏趣味编程》 童晶火柴人跑酷游戏的思路是,玩家通过键盘控制火柴人的奔跑和跳跃,躲避蝙蝠到达终点。游戏地图随机生成,随着关卡数增加,游戏难度越来越大定义Player类class Player{public: IMAGE im_show; // 当前时刻要显示的图像 float x_left, y_bottom; // 左下角位置 float vx, vy;

2021-10-23 14:30:53 12270 16

原创 C++入门——实现“祖玛”游戏

参考《C和C++游戏趣味编程》 童晶祖玛游戏游戏的思路是,各种颜色的小球沿着轨道移动,玩家必须阻止小球进入轨道终点的城堡。玩家移动鼠标控制炮台旋转,按下鼠标右键更换小球颜色,点击鼠标左键发射小球。发射的小球进入轨道,如果周围有连续3个相同颜色的小球即可消除顶点类游戏中小球会沿着固定的轨迹移动,而轨迹可由一些离散的顶点组成,定义顶点类:class Point{public: float x, y; Point() { } Point(float ix, float iy)

2021-10-22 17:45:20 3979 3

原创 C++入门——实现“坚持一百秒”游戏

参考《C和C++游戏趣味编程》 童晶坚持一百秒游戏游戏主要思路是玩家通过鼠标控制火箭躲避一架UFO和越来越多的反弹子弹背景显示利用事先准备的background.png图片,在画面中显示背景图片:#include <graphics.h>#include <conio.h>#define WIDTH 560#define HEIGHT 800int main(){ IMAGE im_bk; // 定义图像对象

2021-10-21 16:05:49 1058 2

原创 网络编程——基于UDP的服务器端和客户端

参考《TCP/IP网络编程》基于UDP的服务器端和客户端UDP套接字的特点UDP的特性与信件完全相符。信件的特点使我们无法确认对方是否收到,另外,邮寄过程中也可能发生信件丢失的情况。即信件是一种不可靠的传输方式,类似地,UDP提供的也是不可靠的数据传输服务UDP与TCP如果只考虑可靠性,TCP比UDP好。UDP的可靠性虽比不上TCP,但也不会像想象中那么频繁地发生数据损毁UDP的性能有时会比TCP高很多,编程中实现UDP也比TCP简单UDP在结构上比TCP更简洁。UDP不会发

2021-10-20 17:55:30 4039

原创 C++入门——绘制樱花树

参考《C和C++游戏趣味编程》樱花树通过鼠标交互设定樱花树的高度和分散程度,鼠标右键点击设置是否显示过程动画,鼠标左键点击开始绘制绘制过程抽象(1)绘制一个树干(2)绘制其左边的子树干,绘制其右边的子树干(3)当到第n代树干时停止生成子树干#include <graphics.h>#include <conio.h>#include <stdio.h>#include <math.h>#define PI 3.1415926#

2021-10-13 17:53:17 10059 9

原创 C++入门——实现十字消除游戏

参考《C和C++游戏趣味编程》 童晶十字消除游戏用户点击空白方块,沿其上、下、左、右方向寻找一个彩色方块,如果有两个或两个以上颜色一致,就将其消除。在进度条时间结束前消除足够的方块,可以进入下一关红色方块的表示与绘制定义Block结构体,利用Block类型的二维数组存储画面中所有小方块的信息。在startup()中将所有方块设置为红色填充、白色线条,在show()中绘制出所有方块:#include <graphics.h>#include <conio.h>#i

2021-10-12 18:12:50 2131

原创 C++入门——实现推箱子游戏

参考《C和C++游戏趣味编程》 童晶推箱子游戏玩家通过键盘控制游戏角色将所有黄色箱子推到白色方块处用字符数组存储关卡数据游戏一共有6种元素:(1)空白区域:玩家可以穿过,箱子可以推上去;英文名称:empty;缩写:‘e’(2)墙:玩家不能经过,箱子不能推过去;英文名称:wall;缩写:‘w’(3)箱子:在前面没有障碍物的情况下,玩家可以推动;英文名称:box;缩写:‘b’(4)空白目标:需要玩家将箱子推上去;英文名称:target;缩写:‘t’(5)完成目标:一个箱子在目标上的叠加

2021-10-06 00:26:25 2071 1

原创 C++入门——实现十步万度游戏

参考《C和C++游戏趣味编程》 童晶十步万度游戏用鼠标点击任意一个小圆圈,其指针顺时针旋转90度,后续被指向的圆圈指针也依次旋转,所有圆圈的旋转度数累积。玩家点击10次,尝试得到尽量高的旋转度数绘制圆圈和指针定义一个结构体Round,用于保存圆圈的信息,成员变量有圆圈的圆心坐标、半径和角度。进一步,定义一个Round类型的二维数组,保存所有圆圈的信息#include <graphics.h>#include <conio.h>#include <math.

2021-10-05 15:25:36 778 2

原创 C++入门——实现贪吃蛇游戏

参考《C和C++游戏趣味编程》贪吃蛇游戏键盘控制小蛇上、下、左、右移动,迟到食物后长度加1;蛇头碰到自身或窗口边缘,游戏失败程序框架#include <graphics.h>#include <conio.h>#include <stdio.h>// 全局变量定义void startup() // 初始化函数{}void show() // 绘

2021-10-04 17:35:47 10624 8

原创 网络编程——TCP原理

参考《TCP/IP网络编程》 尹圣雨TCP原理TCP套接字中的I/O缓冲TCP套接字的数据收发无边界,例如,客户端可以缓慢地分批接收服务器端一次性传输的数据实际上,write函数调用后并非立即传输数据,read函数调用后也并非马上接收数据。更准确地,write函数调用瞬间,数据将移至输出缓冲,在适当的时候(不管是分别传送还是一次性传送)传向对方的输入缓冲;read函数调用瞬间,从输入缓冲读取数据这些I/O缓冲特性如下:I/O缓冲在每个TCP套接字中单独存在I/O缓冲在创建套接字时自动生

2021-10-03 23:30:58 297

原创 网络编程——回声客户端的完美实现和定义应用层协议

参考《TCP/IP网络编程》 尹圣雨回声客户端的完美实现和定义应用层协议回声客户端的问题回声客户端的核心代码段为:while (1){ fputs("Input message(Q to quit): ", stdout); fgets(message, BUF_SIZE, stdin); ... write(sock, message, strlen(message)); str_len = read(sock, message, BUF_SIZE

2021-10-02 23:39:59 302

原创 C++入门——实现见缝插圆游戏

参考《C和C++游戏趣味编程》见缝插圆随机生成的圆互不相交且尽量填满画布,按空格键可以切换不同的绘制模式每次增加一个随机圆设定圆的个数circleNum=100,定义3个数组用于存储所有圆的圆心坐标、半径,然后每隔100毫秒,添加一个随机圆并绘制#include <graphics.h>#include <conio.h>#include <stdio.h>#include <time.h>int main(){ int widt

2021-10-02 11:49:47 1629 2

原创 C++入门——实现见缝插针游戏

参考《C和C++游戏趣味编程》 童晶见缝插针“见缝插针”游戏:按下空格键后发射一根针到圆盘上,所有针逆时针方向转动;如果新发射的针碰到已有的针,游戏结束绘制圆盘与针绘制一个圆表示圆盘、一条线段表示一根针,圆心坐标及线段起点坐标均为(width/2, height/2)#include <graphics.h>#include <conio.h>#include <stdio.h>int main(){ int width = 800; in

2021-10-01 00:28:19 2599 1

原创 C++入门——实现“旋转蛇”错觉

参考《C和C++游戏趣味编程》 童晶“旋转蛇”错觉绘制错觉图片,使静止的圆盘看起来有在转动的错觉绘制扇形函数solidpie(left, top, right, bottom, stangle, endangle)可以绘制无边框的填充扇形。其中(left, top)、(right, bottom)为扇形对应圆的外切矩形的左上角、右下角坐标,stangle、endangle为扇形的起始角、终止角(单位为弧度)#include <graphics.h>#include <co

2021-09-26 17:16:17 2323 4

原创 网络编程——面向连接的服务器端和客户端的编写

参考《TCP/IP网络编程》 尹圣雨面向连接的服务器端和客户端的编写理解TCP和UDP根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字。因为TCP套接字是面向连接的,因此又称为流(stream)的套接字TCP是Transmission Control Protocol(传输控制协议)的简写,意为“对数据传输过程的控制”TCP/IP的协议栈TCP/IP协议栈共分为4层,可以理解数据收发分成了4个层次化过程。(1)应用层;(2)TCP/UDP层;(3)IP层;(4

2021-09-25 18:21:43 651

原创 网络编程——分配给套接字的IP地址与端口号

参考《TCP/IP网络编程》 尹圣雨分配给套接字的IP地址与端口号IP是Internet Protocol(网络协议)的简写,是为收发网络数据而分配给计算机的值。端口号并非赋予计算机的值,而是为区分程序中创建的套接字而分配套接字的序号网络地址(Internet Address)IP地址分为两类:(1)IPv4(Internet Protocol version 4):4字节地址族(2)IPv6(Internet Protocol version 6):16字节地址族现在还是主要使用IPv

2021-09-21 22:06:31 2849

原创 网络编程——套接字类型与协议设置

参考《TCP/IP网络编程》 尹圣雨套接字类型与协议设置创建套接字#include <sys/socket.h>int socket(int domain, int type, int protocol);成功时返回文件描述符,失败时返回-1。domain:套接字中使用的协议族(Protocol Family)信息;type:套接字数据传输类型信息;protocol:计算机通信中使用的协议信息协议族头文件sys/socket.h中声明的协议族:PF_INET:IPv4

2021-09-20 22:06:24 563

原创 网络编程——基于Windows编写服务器端和客户端

参考《TCP/IP网络编程》 尹圣雨基于Windows编写服务器端和客户端Windows套接字(Winsock)大部分是参考BSD系列UNIX套接字设计的,所以很多地方与Linux套接字类似。因此,只需要更改Linux环境下编好的一部分网络程序内容,就能在Windows平台下运行为什么同时学习Linux和Windows大多数项目都在Linux系列的操作系统下开发服务器端,而多数客户端是在Windows平台下开发的。而且,有时程序还需要在两个平台之间相互切换Windows套接字编程的预备导

2021-09-20 12:40:40 2130

原创 网络编程——基于Linux编写服务器端和客户端

参考《TCP/IP网络编程》 尹圣雨基于Linux编写服务器端和客户端编写“Hello World!”服务器端服务器端是能够受理连接请求的程序。服务器端创建的套接字又称为服务器端套接字或监听(listening)套接字步骤调用socket函数创建套接字调用bind函数分配IP地址和端口号调用listen函数将套接字转为可接收连接的状态调用accept函数受理连接请求调用write函数用于传输数据各函数的原型scoket函数#include <sy

2021-09-20 12:35:47 2859

原创 C++入门——别碰方块游戏

参考《C和C++趣味游戏编程》 童真“别碰方块”游戏实现一个小球跳跃躲避方块的游戏空格键控制小球起跳让小球初始在地面上,按下空格键后起跳,落地后小球静止#include <graphics.h>#include <conio.h>#include <stdio.h>int main(){ float width, height, gravity; // 游戏画面宽高、重力加速度 float ball_x, ball_y,

2021-09-19 22:58:47 808 5

原创 C++入门——仿真小球自由落体运动和抛物线运动

参考《C和C++游戏趣味编程》 童真仿真自由落体的小球实现小球受重力影响加速下落后,碰到地面反弹的效果代码如下:#include <graphics.h>#include <conio.h>#include <stdio.h>int main(){ float y = 100; // 小球的y坐标 float vy = 0; //

2021-09-19 11:03:29 3942 1

原创 C++入门——机房预约系统

参考链接https://www.bilibili.com/video/BV1et411b73Z?p=282机房预约系统机房预约系统需求系统简介学校现有几个规格不同的机房,由于使用时经常出现撞车现象,现开发一套机房预约系统,解决这一问题身份简介分别有三种身份使用该程序学生代表:申请使用机房教师:审核学生的预约申请管理员:给学生、教师创建账号机房简介机房共有三间:1号机房,最大容量20人2号机房,最大容量50人3号机房,最大容量100人申请简介申请的订单每周由管理

2021-09-18 23:13:15 1910

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除