作业--day34

使用select完成TCP并发服务器和客户端

server.c

#include <myhead.h>#define PORT 8888
#define IP "192.168.125.137"int main(int argc, const char *argv[])
{int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd == -1){perror("socket error");return -1;}int reuse = -1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1){perror("setsockopt error");return -1;}struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(IP);if(bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}if(listen(sfd, 128) == -1){perror("listen error");return -1;}struct sockaddr_in cin;socklen_t socklen = sizeof(cin);char buf[128] = "";fd_set readfds;FD_ZERO(&readfds);FD_SET(0, &readfds);FD_SET(sfd, &readfds);int res = -1;fd_set tempfds;struct sockaddr_in arr_cin[1024];int maxfd = sfd;while(1){tempfds = readfds;res = select(maxfd+1, &tempfds, NULL, NULL, NULL);if(res == -1){perror("select error");return -1;}else if(res == 0){puts("time out");return -1;}for(int index=0; index<=maxfd; index++){if(!FD_ISSET(index, &tempfds)){continue;}if(index == sfd){int newfd = accept(sfd, (struct sockaddr *)&cin, &socklen);if(newfd == -1){perror("accept error");return -1;}arr_cin[newfd] = cin;printf("[%s: %d] 已连接\n", inet_ntoa(arr_cin[newfd].sin_addr), ntohs(arr_cin[newfd].sin_port));FD_SET(newfd, &readfds);if(newfd > maxfd){maxfd = newfd;}}else if(index == 0){fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = 0;for(int i=4; i<=maxfd; i++){send(i, buf, sizeof(buf), 0);}}else{bzero(buf, sizeof(buf));int res = recv(index, buf, sizeof(buf), 0);if(res == 0){puts("客户端已下线");close(index);FD_CLR(index, &readfds);for(int i=maxfd; i>0; i--){if(FD_ISSET(i, &readfds)){maxfd = i;break;}}continue;}printf("[%s: %d] %s\n", inet_ntoa(arr_cin[index].sin_addr), ntohs(arr_cin[index].sin_port), buf);strcat(buf, "*_*");send(index, buf, sizeof(buf), 0);}}}close(sfd);return 0;
}

client.c

#include <myhead.h>#define PORT 8888
#define IP "192.168.125.137"int main(int argc, const char *argv[])
{int cfd = socket(AF_INET, SOCK_STREAM, 0);if(cfd == -1){perror("socket error");return -1;}struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(IP);if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}fd_set readfds;fd_set tempfds;FD_ZERO(&readfds);FD_SET(0, &readfds);FD_SET(cfd, &readfds);int res = -1;struct sockaddr_in arr_cin[1024];char buf[128] = "";while(1){tempfds = readfds;res = select(cfd+1, &tempfds, NULL, NULL, NULL);if(res == -1){perror("select error");return -1;}else if(res == 0){puts("time out");return -1;}if(FD_ISSET(cfd, &tempfds)){bzero(buf, sizeof(buf));res = recv(cfd, buf, sizeof(buf), 0);if(res == 0){puts("服务器已下线");break;}printf("[%s: %d] %s\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), buf);}if(FD_ISSET(0, &tempfds)){bzero(buf, sizeof(buf));fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = 0;send(cfd, buf, sizeof(buf), 0);}}close(cfd);return 0;
}

在这里插入图片描述

使用poll完成TCP并发服务器和客户端

server.c

#include <myhead.h>#define PORT 8888
#define IP "192.168.125.137"void del_arr(struct pollfd fds[], int *max, int index){for(int i=index; i<(*max)-1; i++){fds[i] = fds[i+1];}(*max) -= 1;
}int main(int argc, const char *argv[])
{int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd == -1){perror("socket error");return -1;}int reuse = -1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1){perror("setsockopt error");return -1;}struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(IP);if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}if(listen(sfd, 128) == -1){perror("listen error");return -1;}struct sockaddr_in cin;socklen_t socklen = sizeof(cin);char buf[128] = "";int res = -1;struct pollfd fds[1024];fds[0].fd = 0;fds[0].events = POLLIN;fds[1].fd = sfd;fds[1].events = POLLIN;struct sockaddr_in arr_cin[1024];int newfd = -1;int max = 2;while(1){res = poll(fds, max, -1);if(res < 0){perror("poll error");return -1;}else if(res == 0){puts("time out");return -1;}for(int index=0; index<max; index++){if(fds[index].revents == POLLIN){if(index == 0){bzero(buf, sizeof(buf));fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = 0;for(int i=2; i<max; i++){send(fds[i].fd, buf, sizeof(buf), 0);}}else if(index == 1){if((newfd = accept(fds[index].fd, (struct sockaddr*)&cin, &socklen)) == -1){perror("accept error");return -1;}fds[max].fd = newfd;fds[max].events = POLLIN;max++;arr_cin[newfd] = cin;printf("[%s: %d] 已上线\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));}else{bzero(buf, sizeof(buf));res = recv(fds[index].fd, buf, sizeof(buf), 0);if(res == 0){puts("客户端已下线");del_arr(fds, &max, index);continue;}printf("[%s: %d] %s\n", inet_ntoa(arr_cin[fds[index].fd].sin_addr), ntohs(arr_cin[fds[index].fd].sin_port), buf);}}}}close(sfd);return 0;
}

client.c

#include <myhead.h>#define PORT 8888
#define IP "192.168.125.137"int main(int argc, const char *argv[])
{int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd == -1){perror("socket error");return -1;}int reuse = -1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1){perror("setsockopt error");return -1;}struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(IP);if(connect(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}char buf[128] = "";int res = -1;struct pollfd fds[2];fds[0].fd = 0;fds[0].events = POLLIN;fds[1].fd = sfd;fds[1].events = POLLIN;while(1){res = poll(fds, 2, -1);if(res < 0){perror("poll error");return -1;}else if(res == 0){puts("time out");return -1;}if(fds[0].revents == POLLIN){bzero(buf, sizeof(buf));fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = 0;send(sfd, buf, sizeof(buf), 0);}if(fds[1].revents == POLLIN){bzero(buf, sizeof(buf));res = recv(sfd, buf, sizeof(buf), 0);if(res == 0){puts("服务器已下线");break;}printf("[%s: %d] %s\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), buf);}}close(sfd);return 0;
}

在这里插入图片描述

思维导图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/235678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 网络模式 -day05

docker 启动时候还会有&#xff0c;名为docker0的虚拟网桥&#xff0c;注意网址为 127.0.0.1 [rootiZuf6hxabqikytnrumsi4gZ ~]# ifconfig docker0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.2…

Java atomic 的原理?

Java atomic 的原理&#xff1f; 在 Java 中&#xff0c;java.util.concurrent.atomic 包提供了一组原子类&#xff0c;用于实现原子性操作&#xff0c;避免了多线程并发访问时可能出现的竞态条件。这些原子类使用底层的 CAS&#xff08;Compare-And-Swap&#xff09;操作&…

基于k6和python进行自动化性能测试

摘要&#xff1a;在性能测试中&#xff0c;达到相应的性能指标对于一个软件来说十分重要&#xff0c;在本文中&#xff0c;将介绍一种现代化性能测试工具k6。 import http from k6/http; import { sleep } from k6; export default function () {http.get(https://test-api.co…

Backend - Django 项目创建 运行

目录 一、配置环境 二、创建 Django 项目 &#xff08;一&#xff09;新建文件夹 &#xff08;二&#xff09;打开文件夹 &#xff08;三&#xff09;打开运行终端 &#xff08;四&#xff09;创建基础项目 &#xff08;五&#xff09;创建app 1. 安装Django &#xf…

note-1

一个“逆向思维”的小例子&#xff1a;“一男生晚上到某银行ATM机存款&#xff0c;碰ATM机出现故障&#xff0c;5000元被吞。当即联系银行&#xff0c;被告知要等到天亮才能维修。其绞尽脑汁的想突然灵机一动&#xff0c;使用公用电话致电客服称&#xff1a;ATM机多吐出3000元&…

VR智慧酒店:提升人气入住率,助力酒店开辟新赛道

随着智能科技的不断进步&#xff0c;智能感、科技感也体现在我们的住宿体验上&#xff0c;VR智慧酒店可以让用户沉浸式体验高质量的酒店服务&#xff0c;这种全新的体验方式助力开启智能化酒店获客新模式&#xff0c;引爆超人气入住率。 传统的酒店行业推广成本高、效果差&…

map|动态规划|单调栈|LeetCode975:奇偶跳

作者推荐 【贪心算法】【中位贪心】.执行操作使频率分数最大 涉及知识点 单调栈 动态规划 map 题目 给定一个整数数组 A&#xff0c;你可以从某一起始索引出发&#xff0c;跳跃一定次数。在你跳跃的过程中&#xff0c;第 1、3、5… 次跳跃称为奇数跳跃&#xff0c;而第 2、…

linux 驱动——私有数据

文章目录 linux 驱动中的私有数据container_of驱动程序应用程序模块使用 linux 驱动中的私有数据 container_of 参考&#xff1a;linux——宏 list_entry/container_of 驱动程序 #include "linux/device/class.h" #include "linux/export.h" #include…

Python人脸识别

实现效果 代码 import cv2# 加载人脸识别分类器 face_cascade cv2.CascadeClassifier(haarcascade_frontalface_default.xml)# 打开摄像头 cap cv2.VideoCapture(0)while True:# 读取摄像头捕获的帧ret, frame cap.read()# 将帧转换为灰度图像gray cv2.cvtColor(frame, c…

迪文屏开发保姆级教程——页面键盘

迪文屏页面键盘保姆级教程。 本篇文章主要介绍了在DGBUS平台上使用页面键盘的步骤。 迪文屏官方开发指南PDF&#xff1a;&#xff08;不方便下载的私聊我发给你&#xff09; https://download.csdn.net/download/qq_21370051/88647174?spm1001.2014.3001.5503https://downloa…

vivado 关于时钟

关于时钟 在数字设计中&#xff0c;时钟代表了从寄存器可靠传输数据的时间基准注册。AMD Vivado™集成设计环境&#xff08;IDE&#xff09;计时引擎使用时钟计算时序路径要求并通过以下方式报告设计时序裕度的特性松弛计算的方法有关更多信息&#xff0c;请参阅Vivado Design…

Oracle 游标混合使用

存储过程&#xff1a;cursor_4 &#xff08;cursor_1 cursor_2 cursor_3 &#xff09; CREATE OR REPLACE PROCEDURE TKSWSHRZS.PROC_BBBBB(in_FYear NUMBER ,in_FPeriod NUMBER ) ISv_name varchar2(100) :;v_adminnumber varchar2(100) :;v_Company_FNumber VARCHAR2(10…

AI百模大战:引领行业变革与开启人才黄金时代

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 技术进步&#xff1a;AI的飞速发展 1. 深度学习的多领域应用 2. 自然语言处理的语境理解提升 3. 计算机视觉的实时处理能力提高 4…

Python学习笔记(六):函数的多返回值、函数的多种参数使用形式、匿名函数、文件的读取操作、文件的写入 、文件的追加

目录 一、函数的多返回值 二、函数的多种参数使用形式 2.1位置参数 2.2关键字参数 2.3缺省参数 2.4不定长参数 三、匿名函数 3.1 函数作为参数传递 3.2 函数的定义 3.3 匿名函数定义语法&#xff1a; 四、文件的读取操作 4.1 open&#xff08;&#xff09;打开函数…

图卷积神经网络发展

1. 图神经网络&#xff08;GNN&#xff09; 图神经网络的概念最早在2005年提出。2009年Franco博士在其论文 [2]中定义了图神经网络的理论基础。 本文中所提到的图均指图论中的图(Graph)。它是一种由若干个结点(Node)及连接两个结点的边(Edge)所构成的图形&#xff0c;用于刻画…

ETL-从1学到100(1/100):ETL涉及到的名词解释

本文章主要介绍ETL和大数据中涉及到名词&#xff0c;同时解释这些名词的含义。由于不是一次性收集这些名词&#xff0c;所以这篇文章将会持续更新&#xff0c;更新日志会存放在本段话下面&#xff1a; 12-19更新&#xff1a;OLTP、OLAP、BI、ETL。 12-20更新&#xff1a;ELT、…

php文本文件操作和php文本文件操作像数据库一样操

一、在PHP中&#xff0c;你可以使用一些内置的函数来进行文本文件操作。下面是一些常见的文本文件操作示 例&#xff1a; 打开文件&#xff1a; $filename "example.txt"; $file fopen($filename, "r"); // 打开文件以供读取 $file fopen($filename,…

【模式识别】解锁降维奥秘:深度剖析PCA人脸识别技术

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《模式之谜 | 数据奇迹解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f30c;1 初识模式识…

12.20力扣

2828. 判别首字母缩略词 题目介绍&#xff1a;   给你一个字符串数组 words 和一个字符串 s &#xff0c;请你判断 s 是不是 words 的 首字母缩略词 。   如果可以按顺序串联 words 中每个字符串的第一个字符形成字符串 s &#xff0c;则认为 s 是 words 的首字母缩略词。…

智能化物联网(IoT):发展、问题与未来前景

导言 智能化物联网&#xff08;IoT&#xff09;作为信息技术领域的一项核心技术&#xff0c;正在深刻改变人们的生活和工作方式。本文将深入研究IoT的发展过程、遇到的问题及解决过程、未来的可用范围&#xff0c;以及在各国的应用和未来的研究趋势。探讨在哪些方面能够取得胜利…