想拿走即可运行的同学请严格按照我的目录结构准备好文件夹和文件
拷贝完成后将wuziqi.h文件中的IP地址改为自己linux的IP
ifconfig // Linux终端下查看本机IP地址 suto spt install net-tools // 上面不行的话先执行这条命令,再执行ifconfig
上述都完成后在linux终端在wuziqi目录下make即可启动服务端,这个时候bin目录下会有客户端的可执行文件,将其发给局域网内的其他电脑,添加可执行权限执行,就可以对战了
chmod 0777 wzq_client // 该命令加可执行权限 ./wzq_client //执行
若是报thread的错误请执行下面的两条命令,make不报错的略过
sudo apt-get install glibc-doc #man手册 sudo apt-get install manpages-posix manpages-posix-dev
下面按文件夹发代码,一共7个文件注意别粘贴错了!!!
首先是wuziqi目录下的Makefile文件
OBJS:=net.o server.o client.o
OBJSSER:=net.o server.o
OBJSCLI:=net.o client.o
APP:=wzq_server wzq_client
FLAGS:=-g -c
CC:=gcc
export OBJS APP FLAGS CC OBJSSER OBJSCLI
ALL:
make -C ./src
make -C ./obj
./bin/wzq_server
.PHONY:clean
clean:
$(RM) ./obj
int main()
{
int listenfd, connfd;
struct sockaddr_in servaddr, cliaddr;
socklen_t perrlen = sizeof(cliaddr);
fun_serversock(&listenfd, &servaddr);
int sum_thread = 0; // 创建线程数,全局监控
// 创建监听队列
fd_set readfds, temp, loginning;
// 清空监听队列
FD_ZERO(&readfds);
FD_ZERO(&temp);
FD_ZERO(&loginning);
// 将监听文件描述符加入到监听队列中
FD_SET(listenfd, &readfds);
char buff[MAXSIZE] = {0};
int conns[2] = {-1, -1};
int pos = 0;
while (1)
{
temp = readfds;
int ret = select(MAXFILECOUNT, &temp, NULL, NULL, NULL);
if (ret < 0)
{
perror("select error");
return -1;
}
// 遍历监听队列
for (int i = 0; i < MAXFILECOUNT; ++i)
{
int flag = -1;
// 判断文件描述符是否在监听队列中
if (FD_ISSET(i, &temp))
{
if (i == listenfd)
{ // 监听到新的连接
connfd = accept(listenfd, NULL, NULL);
//FD_SET(i, &readfds);
conns[pos++] = connfd;
if (conns[1] != -1)
{
int temp_conns[2] = {conns[0], conns[1]};
conns[0] = -1, conns[1] = -1;
// 可以配对
pos = 0;
printf("配对成功n");
pid_t pid = fork();
if (0 == pid)
{
int n = response(temp_conns);
if (n < 0)
{
//FD_CLR(temp_conns[0], &readfds); // 从消息队列中删除
//FD_CLR(temp_conns[1], &readfds);
close(temp_conns[0]);
close(temp_conns[1]);
}
}
else if (pid > 0)
{
//wait(NULL);
}
else
{
printf("创建失败!n");
}
}
}
else
{
}
}
}
}
close(listenfd);
return 0;
}
src目录下的client.c文件
#include "../include/wuziqi.h"
int main()
{
struct sockaddr_in cliaddr;
int sockfd;
fun_sock(&cliaddr, &sockfd);
if (connect(sockfd, (struct sockaddr*)&cliaddr, sizeof(cliaddr)) < 0) {
perror("connect error");
return -1;
}
printf("connect successful!n");
int flag = -1; // 接收先后判断位
printf("匹配中...n");
recv(sockfd, &flag, 4, 0);
printf("--匹配成功!%dn", flag);
if(flag == 0){
// 先手
firstBload(&sockfd, &cliaddr, -1);
}else{
// 后手
secondBload(&sockfd, &cliaddr, -1);
}
printf("再次运行即可继续游戏!n");
close(sockfd);
return 0;
}



