栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

局域网五子棋——C语言基于IO多路复用+简易进程工作池的网络编程小项目

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

局域网五子棋——C语言基于IO多路复用+简易进程工作池的网络编程小项目

复制即可运行

想拿走即可运行的同学请严格按照我的目录结构准备好文件夹和文件

拷贝完成后将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;
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/863915.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号