锵锵~最近看到了bit哥开的新坑:Python游戏开发,灵机一动想到了新系列要写什么——就是这个系列啦!
从这一篇开始,我们将逐渐学习搭建一个基于C语言开发的游戏服务器(最终目标当然是和Bit哥的游戏客户端挂钩咯)。
搭建环境
关于环境,我们选择的目标服务器是Ubuntu20.04,有其他系统的小伙伴一定要注意系统差距哦~
既然是要开发游戏服务器,那么我们首先一定要有一台服务器。这里指的服务器是那种长期运行的计算机——当然,你手上的本本不是不可以运行Server程序,但是你是做不到24小时开机和稳定的IP的。
如果是像我一样购置了云服务器的朋友们可以略过下面这段恰饭时间:
如果受限于以上两点,但又想把自己写的服务器开出去和小伙伴们玩的,可以选择在我这里寻求服务器托管功能(微信号zzkklep),只收一点点的算力费用哦。
开始开发
网络通信
既然说要开发服务器,那么我们首先要学习的就是网络通信相关的知识——毕竟,如果不能在网上通信还叫哪门子的服务器呢?
C语言中视采用系统的不同有不同的网络通信模块,我们着重讲解Linux下的网络通信。在网络上,我们通常采用的是TCP或UDP协议进行通信(也被称为传输层协议),在传输层协议的基础上,前人定义了一套名为Socket的工具供我们方便快捷的进行网络连接。
Socket
Socket,中文叫法是套接字,它是一个抽象的概念,一个Socket代表着一次网络通信中的某一端,Socket是应用和操作系统之间交互的接口,系统通过套接字将封装的网卡功能提供给应用程序使用。
在LinuxC编程中,Socket的主体功能分散在多个库中,我们可以编写头文件如下
//SocketDefine.h
#ifndef SOCKETDEFINE_HEADFILE
#define SOCKETDEFINE_HEADFILE
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#endif
这里留给读者一个练习题,考虑如下代码
#ifndef SOCKETDEFINE_HEADFILE
#define SOCKETDEFINE_HEADFILE
....... //其余代码
#endif
会起到什么功能呢?
Socket入门
在正式开始写代码之前请允许我推荐一篇帖子,这里面记载了大部分的Socket常用函数。
链接:C语言常用Socket函数速查
然后让我们来了解一下获取一个用于通信的Socket具体要怎么做。一般来说,声明一个Socket服务器需要经过如下步骤
TCP | UDP |
---|---|
socket() | socket() |
bind() | bind() |
listen() | |
accept() |
而声明一个Socket客户端则要经过如下步骤
TCP | UDP |
---|---|
socket() | socket() |
bind() | bind() |
connect() |
可以看到,TCP在各种意义上相较UDP都要更复杂一些,不过不必担心,我们接下来会好好讲讲两者的不同之处。
Socket熟练
TCP和UDP最大的不同在于UDP获取的数据会直接从端口上取到,而TCP则会在accept()之后返回一个新的Socket供君使用,除此之外使用I/O进行交互的部分是一致的(具体参见上面那篇文章)。
在Socket使用完毕打算关闭时,不论你是TCP还是UDP,请一定不要忘记释放你从socket()函数或是accept()那里得来的Socket(我们一般称这个为Socket描述符),具体的办法是使用close()函数进行操作。
今日作业
思考上面的宏定义的作用,并尝试自己写一个类似的。
阅读Socket函数集。
源码下载
本系列提及的源码全部可以在http://www.xeler.top/code/进行下载,如果网站不能访问也可以加我的微信号zzkklep获取
转载:https://blog.csdn.net/u013506650/article/details/115470553