以下用到的TCP协议的程序代码见:网络编程------TCP协议网络程序
以下用到的三子棋的游戏规则的相关代码见:三子棋
在网络编程------TCP协议网络程序一文中根据TCP协议分别实现了单进程,多进程,多线程版本的服务器端程序。在多进程和多线程环境中服务器可以同时接收来自多个客户端的连接请求并与之互发消息进行通信。在本文中将继续根据TCP协议来实现与客户端的通信。
本文中的二者通信是基于之前写过的三子棋小游戏。客户端和服务器端分别扮演两个游戏玩家,来实现对战操作。服务器端和客户端在正式进入游戏前的操作与在网络编程------TCP协议网络程序一文中的操作相同。
服务器端:先打开网卡文件,绑定套接字,将文件描述符设置为监听模式,接收来自客户端的连接请求。客户端:打开文件描述符,向服务器端发出连接请求。关于二者这部分前期的工作不在重复。
待二者连接建立成功之后,便开始通信。因为二者要下棋对战,所以每次都要将各自的下棋坐标位置发给对方,然后各自将棋盘打印出来。一人一次走一步,一个人发完消息,另一个人接收完之后在发送自己的坐标选择给对方。这就实现了二者之间通过网络来对战的目的。
所以该程序代码是三子棋项目和TCP协议网络协议代码的结合。具体如何实现可参照上述两篇博客。
代码如下:
头文件comm.h:
#pragma once
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<time.h>
#define ROW 3
#define COL 3
//坐标信息
typedef struct
{
int x;
int y;
}location;
//客户端发送的进入游戏或退出游戏的信息
typedef struct Res
{
int res;//1表示开始游戏,0表示退出游戏
}Response;
void menu();//打印菜单
void print(char arr[ROW][COL], int x, int y);//打印棋盘
void Init(char arr[ROW][COL], int x, int y);//初始化数组
//移动函数
void move(char arr[ROW][COL],int x,int y,location* loc,char flag);
int iswin(char arr[ROW][COL], int x, int y);//判断是否有人赢或产生平局
int who_win(int ret);//判断是谁赢
服务器端和客户端使用的一些方法封装函数文件comm.c:
#include "comm.h"
void Init(char arr[ROW][COL], int x, int y)//数组的初始化函数定义
{
memset(arr, ' ', x*y*sizeof(arr[0][0]));
}
void menu()//菜单函数定义
{
printf("*****************************\n");
printf("****1.开始游戏 0.退出游戏****\n");
printf("*****************************\n");
}
void print(char arr[ROW][COL], int x, i