鏘鏘~最近看到了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://www.uj5u.com/qita/274400.html
標籤:其他
上一篇:MYSQL1366錯誤以及MYSQL啟動錯誤1053的解決
下一篇:第一章-概述
