【多人在线游戏架构实战-基于C++的分布式游戏编程】开篇

学习一门语言很久了,却从来没有用它做过项目,刚学的时候用它来写过一个黑白通讯录,后来又常常用它来刷题。会了Java以后,刷题也不愿意去用这门语言了,没错它就是C++,一把锋利的瑞士军刀。这个国庆节期间,我要定时更新这本《多人在线游戏架构实战-基于C++的分布式游戏编程》的笔记,用来给学生时代的C++留下一个美好的回忆。

本系列笔记的内容均在 deepin 20.7 环境下完成。

2022-10-1

于深圳   

阻塞式网络编程

随书的附录代码在https://github.com/setuppf/GameBookServer,首先就遇到了一个下马威,01-01_network_first的 make-all.sh执行出错。

提示没有cmake3命令,于是安装cmake。

sudo apt install cmake

依然提示没有找到cmake3命令,于是我对第20行做了更改。这是因为原书是在centos下写的,centos是一个很老旧的系统,自带的cmake版本是cmake2,因此centos是 cmake3 命令。在我的deepin上,直接使用cmake就行了。我预感后面可能还会踩到这些坑。

cmake -DCMAKE_BUILD_TYPE=${buildType} ./

这一节主要接触到了linux与windows平台下的兼容情况。使用了条件编译来解决,同样的函数名,在不同的OS下有不同的具体实现。

#ifndef WIN32 //如果不是在 Windows 平台下
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> 

#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>

#define SOCKET int
#define INVALID_SOCKET -1
#define _sock_init( )
#define _sock_exit( )
#define _sock_err( )	errno
#define _sock_close( sockfd ) ::close( sockfd )
#else //否则在 Windows 平台下
#include <Ws2tcpip.h>
#include <windows.h>
#define _sock_init( )	{ WSADATA wsaData; WSAStartup( MAKEWORD(2, 2), &wsaData ); }
#define _sock_exit( )	{ WSACleanup(); }
#define _sock_err( )	WSAGetLastError()
#define _sock_close( sockfd ) ::closesocket( sockfd )
#endif //结束条件编译

在 Clion 这个ide下,不执行的部分会自动折叠,这很棒!

书上有个错误,windows下与linux 下的_socket_err 这个函数搞反了。


一些函数

socket 函数,3个参数(family,type,protocol )分别制定ipv4or6,是否是连续可靠,以及TCP/UDP。返回值是一个正数,在连接存续期间,其他程序是不能使用这个特定值的。

bind函数 3个参数(sockid,address,address_len)。第一个是socket的id,第二个是一个套接字地址结构,包含了ip地址和端口。第三个是套接字低级结构的长度

这里的sockaddr为什么可以传入一个 sockaddr_in 的结构体呢,难道类似于Java的向上转型?我看了这个结构没发现“泛型”的标志。其实这是c++比较自由的特点,简而言之,程序员利用类型转换欺骗了编译器。编译器拿着sockaddr_in 为sockaddr 赋值,sockaddr的某个参数需要几个字节,就从冒充的sockaddr_in 里的对应位置拿。

listen 2个参数,分别是socket的id以及缓存连接队列的大小。

accept函数 3个参数,返回一个新的socketID,被称为连接socket。参数分别是原先的 socketID我们称之为监听socket;socketaddr(空的);以及socketaddr的长度。

send和recv函数,这两个函数都有4个参数。分别是:监听socketID;缓存(char数组);缓存的长度;标志位(一般为0)。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值