• 【多人在线游戏架构实战-基于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下有不同的具体实现。

    1. #ifndef WIN32 //如果不是在 Windows 平台下
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #define SOCKET int
    12. #define INVALID_SOCKET -1
    13. #define _sock_init( )
    14. #define _sock_exit( )
    15. #define _sock_err( ) errno
    16. #define _sock_close( sockfd ) ::close( sockfd )
    17. #else //否则在 Windows 平台下
    18. #include
    19. #include
    20. #define _sock_init( ) { WSADATA wsaData; WSAStartup( MAKEWORD(2, 2), &wsaData ); }
    21. #define _sock_exit( ) { WSACleanup(); }
    22. #define _sock_err( ) WSAGetLastError()
    23. #define _sock_close( sockfd ) ::closesocket( sockfd )
    24. #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)。

  • 相关阅读:
    textarea自动高度 笔记221106
    leetcode最大二叉树
    Apollo学习(一)了解
    GEE开发之Landsat8_SR计算NDVI和数据分析
    (二十) 共享模型之工具【JUC】【线程安全集合类】
    JavaScript基础标准库总结——(1)
    高级数据结构——LRU Cache、LFU Cache
    橙河网络:怎么学习python?
    如何让固定资产管理不再混乱呢?
    CentOS 8.5 - 配置ssh的免密登录
  • 原文地址:https://blog.csdn.net/qq_15046309/article/details/127134080