【开源项目分享】使用select、多线程完成的多人联机对战五子棋小游戏(C语言实现)

  • Post author:
  • Post category:其他



前言:最近在学Linux网络编程,奈何老师太水,这部分内容将都不讲直接让我们做实验。我也只能在网上(博客、全球最大的同性交友网站(bushi))寻找一些可以上手的开源项目。正好看到了这个五子棋小游戏,于是我把这个项目代码过了一遍后,自己动手实现+增加一些自己的功能。项目原版:https://github.com/youngyangyang04/Gomoku

  • 该项目主要分为四个小模块
  1. server.c服务端 :主要用select实现与客户端的连接,用于创建连接并监听网络上客户端的状态,并对客户端的请求作出相应应答,控制游戏进度。
  2. client.c 客户端 :用于向客户端提交请求。
  3. linker.c 存放客户端和服务端通用方法。
  4. checkWin.c:用于服务端检查当前游戏是否有人获得胜利。
  5. client_common.h 存放客户端通用数据和方法声明。
  6. client_common.c 存放客户端通用方法实现。
  7. server_common.h 存放服务端通用数据和方法声明。
  8. 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的客户端退出游戏了。)
在这里插入图片描述


存在的问题:

这个问题是写给我自己看的你们不用管啊- -…

  1. (已解决)由于没有参考,在read和write到客户端消息的相关功能可能会出现fd异常导致服务器退出的问题。因为我在监听函数功能那跳过了当前收发消息客户端的sockfd,导致了收发消息功能函数执行过程中,如果客户端退出,然后监听函数没来得及吧这个sockfd从fd_set中去掉,导致的wirte一个空fd异常退出。问题原因是当客户端意外退出,服务端给客户端write是会收到RST报文,导致内核发送sigpipe信号。而该信号默认处理方式是结束进程,更改信号处理方式为不处理即可。

可改进方向(思路):

  1. 可以开创多个房间,每个房间有个房主。
  2. 房主可以设置五子棋棋盘大小,同时游戏人数,有开始游戏权限。
  3. select模型可以改为epoll,引入线程池,提高服务器并发能力。
  4. 更改传输协议,目前是传struct,后续可以改为json、protobuf等。
  5. 更改完传输协议后,就可以跨平台编写客户端了。

github地址:

https://github.com/Left-Zzzz/muti-Gomoku-master



版权声明:本文为Left_Zzzz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。