【开源项目分享】使用select、多线程完成的多人联机对战五子棋小游戏(C语言实现)
前言:最近在学Linux网络编程,奈何老师太水,这部分内容将都不讲直接让我们做实验。我也只能在网上(博客、全球最大的同性交友网站(bushi))寻找一些可以上手的开源项目。正好看到了这个五子棋小游戏,于是我把这个项目代码过了一遍后,自己动手实现+增加一些自己的功能。项目原版:https://github.com/youngyangyang04/Gomoku
·
前言:最近在学Linux网络编程,奈何老师太水,这部分内容将都不讲直接让我们做实验。我也只能在网上(博客、全球最大的同性交友网站(bushi))寻找一些可以上手的开源项目。正好看到了这个五子棋小游戏,于是我把这个项目代码过了一遍后,自己动手实现+增加一些自己的功能。项目原版:https://github.com/youngyangyang04/Gomoku
- 该项目主要分为四个小模块
- server.c服务端 :主要用select实现与客户端的连接,用于创建连接并监听网络上客户端的状态,并对客户端的请求作出相应应答,控制游戏进度。
- client.c 客户端 :用于向客户端提交请求。
- linker.c 存放客户端和服务端通用方法。
- checkWin.c:用于服务端检查当前游戏是否有人获得胜利。
- client_common.h 存放客户端通用数据和方法声明。
- client_common.c 存放客户端通用方法实现。
- server_common.h 存放服务端通用数据和方法声明。
- server_common.c 存放服务端通用方法实现。
其中,很多参数配置我都放在了common.h、client_common.h、server_common.h中,大家可以根据自己的情况进行修改。
下面是流程展示:
1.common.h中的设置:
2.开启服务器(IP和端口号都在common.h中配置)
3.登录客户端进行游戏(因为设置的玩家数最大3人,客户端数最大4人,所以第四个进入服务器的就拉进观战区)(注意,x、y是棋子下标,设左上坐标为(0,0))
4.游戏结束(由于时间关系,我把玩家C的客户端退出游戏了。)
存在的问题:
这个问题是写给我自己看的你们不用管啊- -…
- (已解决)由于没有参考,在read和write到客户端消息的相关功能可能会出现fd异常导致服务器退出的问题。因为我在监听函数功能那跳过了当前收发消息客户端的sockfd,导致了收发消息功能函数执行过程中,如果客户端退出,然后监听函数没来得及吧这个sockfd从fd_set中去掉,导致的wirte一个空fd异常退出。问题原因是当客户端意外退出,服务端给客户端write是会收到RST报文,导致内核发送sigpipe信号。而该信号默认处理方式是结束进程,更改信号处理方式为不处理即可。
可改进方向(思路):
- 可以开创多个房间,每个房间有个房主。
- 房主可以设置五子棋棋盘大小,同时游戏人数,有开始游戏权限。
- select模型可以改为epoll,引入线程池,提高服务器并发能力。
- 更改传输协议,目前是传struct,后续可以改为json、protobuf等。
- 更改完传输协议后,就可以跨平台编写客户端了。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)