DAY5网络

1.用select实现TCP客户端程序

#include <head.h>
#define PORT 9999 // 服务器端口号
#define IP "192.168.125.74" // 服务器IP地址#define CIP "192.168.125.74" // 客户端
#define CPORT 6666int main(int argc, const char* argv[])
{// 创建套接字int cfd = -1;if ((cfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("socket error\n");return -1;}// 端口快速重用int reus = 1;if ((reus = setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reus, sizeof(reus))) == -1) {perror("setsockopt error\n");return -1;}// 定义地址信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_port = htons(CPORT);cin.sin_addr.s_addr = inet_addr(CIP);// 绑定(非必须)if (bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1) {perror("bind error\n");return -1;}printf("bind success\n");// 定义服务器地址信息结构体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;// 清0FD_ZERO(&readfds);// 将0、cfd放入集合FD_SET(0, &readfds);FD_SET(cfd, &readfds);// 收发数据char buf[128] = ""; // 容器fd_set temp; //int res = -1;while (1) {temp = readfds;res = select(cfd + 1, &temp, NULL, NULL, NULL);if (res < 0) {perror("select error");return -1;} else if (res == 0) {printf("time out\n");return -1;}if (FD_ISSET(0, &temp)) {bzero(buf, sizeof(buf)); // 清零fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = 0;send(cfd, buf, sizeof(buf), 0);}if (FD_ISSET(cfd, &temp)) {bzero(buf, sizeof(buf)); // 清零int res = recv(cfd, buf, sizeof(buf), 0);if(res == 0){printf("服务器下线\n");break;}printf("收到服务器消息:%s\n", buf);}}// 关闭close(cfd);return 0;
}

2.用poll实现服务器

#include <head.h>
#define PORT 9999
#define IP "192.168.125.74"
int main(int argc, const char *argv[])
{int sfd=-1;if((sfd=socket(AF_INET,SOCK_STREAM,0))==-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 len=sizeof(cin);struct sockaddr_in sock[1024];char ok[50];int newfd=-1;int maxfd=4;struct pollfd fds[1024];fds[0].fd=0;fds[0].events=POLLIN;fds[1].fd=sfd;fds[1].events=POLLIN;int count=2;puts("准备就绪");while(1){if(poll(fds,count,-1)==-1){perror("poll error");return -1;}for(int i=0;i<count;i++){	if(fds[i].revents!=POLLIN){continue;}if(i==0){scanf("%s",ok);printf("终端输入%s\n",ok);if(strcmp(ok,"quit")==0)goto aa;for(int j=2;j<count;j++){send(fds[j].fd,ok,sizeof(ok),0);}}else if(i==1){if((newfd=accept(sfd,(struct sockaddr*)&cin,&len))==-1){perror("accept error");return -1;}printf("[%s-%d]:连接成功,newfd=%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);fds[count].fd=newfd;fds[count].events=POLLIN;count++;sock[newfd]=cin;}else{char buf[128]="";int res=recv(fds[i].fd,buf,sizeof(buf),0);if(res==0){close(fds[i]);printf("[%s-%d]:退出\n",inet_ntoa(sock[fds[i].fd].sin_addr),ntohs(sock[fds[i].fd].sin_port));fds[i]=fds[count--];continue;}printf("[%s-%d]:%s\n",inet_ntoa(sock[fds[i].fd].sin_addr),ntohs(sock[fds[i].fd].sin_port),buf);strcat(buf,"sb");send(fds[i].fd,buf,sizeof(buf),0);}}}
aa:close(sfd);return 0;
}


    
    

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

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

相关文章

2023 英特尔On技术创新大会直播让我感受到英特尔AI的强大

一、2023 英特尔On技术创新大会简单回顾 直播地址&#xff1a;英特尔On技术创新大会 (intel.cn) 英特尔明确表示其“四年五个制程节点”计划正在稳步推进当中&#xff0c;并展示了其首个基于通用芯粒高速互连开放规范(UCIe)的多芯粒封装。 英特尔公布了下一代英特尔至强可扩…

大数据---34.HBase数据结构

一、HBase简介 HBase是一个开源的、分布式的、版本化的NoSQL数据库&#xff08;即非关系型数据库&#xff09;&#xff0c;依托Hadoop分布式文件系统HDFS提供分布式数据存储&#xff0c;利用MapReduce来处理海量数据&#xff0c;用Zookeeper作为其分布式协同服务&#xff0c;一…

html之如何设置音频和视频

文章目录 前言一、音频标签&#xff1a;audio1.audio简介2.常用属性controlsautoplayloop代码演示&#xff1a; 二、视频标签&#xff1a;video1.video2.常用的视频元素controlsautoplayloop代码演示&#xff1a; 总结视频元素总结音频元素总结 前言 html中插入音频和视频的方…

【算法设计与分析】——动态规划算法

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

​TrustZone之可信固件

Trusted Firmware是Armv8-A设备的安全世界软件的开源参考实现。Trusted Firmware为SoC开发人员和OEM提供了一个符合相关Arm规格&#xff08;包括TBBR和SMCC&#xff09;的参考Trusted代码库。 以下图表显示了Trusted Firmware的结构&#xff1a; SMC调度程序处理传入的SMC。SMC…

flink sql1.18.0连接SASL_PLAINTEXT认证的kafka3.3.1

阅读此文默认读者对docker、docker-compose有一定了解。 环境 docker-compose运行了一个jobmanager、一个taskmanager和一个sql-client。 如下&#xff1a; version: "2.2" services:jobmanager:image: flink:1.18.0-scala_2.12container_name: jobmanagerports:…

Android 权限申请

在Android中&#xff0c;从Android 6.0&#xff08;API级别23&#xff09;开始&#xff0c;应用在运行时需要动态申请权限。以下是一些步骤来动态申请权限&#xff1a; 在应用的清单文件&#xff08;AndroidManifest.xml&#xff09;中声明需要的权限。例如&#xff0c;如果应…

SpringCloud实现Gateway鉴权

一、JWT 实现微服务鉴权 JWT一般用于实现单点登录。单点登录&#xff1a;如腾讯下的游戏有很多&#xff0c;包括lol&#xff0c;飞车等&#xff0c;在qq游戏对战平台上登录一次&#xff0c;然后这些不同的平台都可以直接登陆进去了&#xff0c;这就是单点登录的使用场景。JWT就…

pip 常用指令 pip show 命令用法介绍

&#x1f4d1;pip 常用命令归类整理 pip show 是一个用于查询已安装 Python 包的详细信息的命令。它可以显示包的名称、版本、位置、依赖关系等信息。 pip show 命令的参数 -f 或 --files&#xff1a;显示包的文件列表。-v 或 --verbose&#xff1a;显示更多的信息。 pip s…

美摄AE模板插件工具,将美摄SDK和AE极致融合

视频内容已经成为企业宣传和品牌建设的重要手段&#xff0c;为了满足企业对于高质量视频制作的需求&#xff0c;美摄科技推出了一款创新性的插件工具——美摄AE模板插件工具。这款工具将美摄SDK能力和Adobe After Effects极致融合&#xff0c;为企业提供了一种快速制作和转化美…

nuxt打包占用磁盘IO

目录 前言排除过程 前言 jenkins运行打包&#xff0c;总是要卡一段时间&#xff0c;磁盘IO很高。我手动执行后的确发现了这个问题&#xff0c;如下图所示。 排除过程 我的方案很原始&#xff0c;利用git恢复到以前的版本&#xff0c;抽检&#xff0c;搞了差不多两个小时&am…

25、新加坡南洋理工、新加坡国立大学提出FBCNet:完美融合FBCSP的CNN,EEG解码SOTA水准![抱歉老师,我太想进步了!]

前言&#xff1a; 阴阳差错&#xff0c;因工作需要&#xff0c;需要查阅有关如何将FBCSP融入CNN中的文献&#xff0c;查阅全网&#xff0c;发现只此一篇文章&#xff0c;心中大喜&#xff0c;心想作者哪家单位&#xff0c;读之&#xff0c;原来是自己大导&#xff08;新加坡工…