10.01

news/2024/11/30 18:41:10/

服务器

#include<myhead.h>
//键盘输入事件
int keybord_events(fd_set readfds)
{char buf[128] = "";int sndfd = -1;             //从终端获取一个文件描述符,发送数据给该文件描述符对应的客户端bzero(buf, sizeof(buf));int res = scanf("%d %s", &sndfd, buf);while(getchar() != 10);if(res != 2)                //终端输入的数据格式错误{printf("输入数据的格式错误,:fd string\n");return -1;}if(sndfd<=2 || FD_ISSET(sndfd, &readfds)==0)        //判断文件描述符的合法性{printf("非法的文件描述符:sndfd=%d\n", sndfd);return -1;}if(send(sndfd, buf, sizeof(buf), 0) < 0){perror("send");return -1;}printf("send success\n");return 0;
}//客户端连接事件
int cliConnect_events(int sfd, struct sockaddr_in saveCin[], fd_set *preadfds, int *pmaxfd)
{int newfd = -1;struct sockaddr_in cin;             //存储客户端的地址信息socklen_t addrlen = sizeof(cin);    //真实的地址信息结构体的大小newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);if(newfd < 0){perror("newfd");return -1;}printf("[%s:%d]客户端连接成功 newfd=%d\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);saveCin[newfd] = cin;                       //将cin另存到newfd对应的下标位置去FD_SET(newfd, preadfds);                    //将newfd添加到集合中*pmaxfd = *pmaxfd>newfd ? *pmaxfd:newfd;    //更新maxfdreturn 0;
}//客户端交互事件
int cliRcvSnd_events(int fd, struct sockaddr_in* saveCin, fd_set *preadfds, int* pmaxfd)
{char buf[128] = "";//清空字符串bzero(buf, sizeof(buf));    //memset//接收ssize_t res = recv(fd, buf, sizeof(buf), 0);if(res < 0){perror("recv");return -1;}else if(0 == res){printf("[%s:%d]客户端下线 newfd=%d\n", \inet_ntoa(saveCin[fd].sin_addr), ntohs(saveCin[fd].sin_port), fd);close(fd);              //关闭文件描述符FD_CLR(fd, preadfds);   //将文件描述符从集合中剔除while(FD_ISSET(*pmaxfd, preadfds)==0 && (*pmaxfd)-->=0);return 0;}printf("[%s:%d] newfd=%d : %s\n", \inet_ntoa(saveCin[fd].sin_addr), ntohs(saveCin[fd].sin_port), fd, buf);//发送strcat(buf, "*_*");if(send(fd, buf, sizeof(buf), 0) < 0){perror("send");return -1;}printf("send success\n");return 0;
}
int main(int argc, const char *argv[])
{int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd<0){perror("socket error");return -1;}printf("socket success\n");//允许端口快速复用int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0){perror("复用失败 error");return -1;}printf("复用成功\n");//绑定地址和端口struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(8888);sin.sin_addr.s_addr=inet_addr("127.0.0.1");//绑定服务器if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){perror("bind error");return -1;}//设置监听模式if(listen(sfd,128)<0){perror("listen error");return -1;}//创建集合fd_set readfds,tempfds;//清空FD_ZERO(&readfds);//添加集合FD_SET(0,&readfds);FD_SET(sfd,&readfds);int maxfd=sfd;int s_res=-1;ssize_t res=-1;char buf[128]="";struct sockaddr_in saveCin[1024];while(1){tempfds =readfds;s_res=select(maxfd+1,&tempfds,NULL,NULL,NULL);if(s_res<0){perror("select error");return -1;}else if(0==s_res){printf("time out,,\n");break;}for(int i=0; i<=maxfd; i++){if(FD_ISSET(i, &tempfds) == 0)continue;//能运行到当前位置,则说明i所代表的文件描述符在集合中if(0 == i)          //0在集合中{printf("触发键盘输入事件\n");keybord_events(readfds);}else if(sfd == i)       //sfd在集合中{printf("触发客户端连接事件\n");cliConnect_events(sfd, saveCin, &readfds, &maxfd);}else{printf("触发客户端交互事件\n");cliRcvSnd_events(i, saveCin, &readfds, &maxfd);}}}if(close(sfd) < 0){perror("close");return -1;}return 0;
}

客户端

#include <myhead.h>#define PORT 8888             //1024~49151
#define IP "127.0.0.1"int main(int argc, const char *argv[])
{//创建流失套接字int cfd=socket(AF_INET,SOCK_STREAM,0);if(cfd<0){perror("socket");return -1;}//填充服务器的ip地址信息结构体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))<0){perror("connect");return -1;}printf("连接服务器成功\n");char buf[128];//与服务器交互while(1){bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';if(send(cfd,buf,sizeof(buf),0)<0){perror("send");return -1;}if(0==strlen(buf)){break;}printf("向服务器发送消息成功\n");bzero(buf,sizeof(buf));if(recv(cfd,buf,sizeof(buf),0)<0){perror("recv");return -1;}printf("服务器:%s\n",buf);}//关闭客户端close(cfd);return 0;
}

结果


http://www.ppmy.cn/news/1132326.html

相关文章

GNN PyG~torch_geometric 学习理解

目录 1. PyG Introduction 2. PyG Installation 2.1 PyG 安装常见错误及原因 2.2 PyG 具体安装步骤 3. torch_geometric packages torch_geometric.data.Data Dataset 与 DataLoader Dropout、BatchNorm 3. torch_geometric: 理解edge_index 3.1 理解 mini-batch edg…

对分段有序的数组排序(前、后部分分别递增)

文章目录 1 题目2 思路2.1 思路1&#xff08;直接插入法&#xff09;2.2 思路2&#xff08;归并&#xff09; 3 实现3.1 思路13.2 思路2 1 题目 设mn个元素顺序存放在数组A[1…mn]中&#xff0c;前m个元素递增有序&#xff0c;后n个元素递增有序&#xff0c;试设计一个在时间和…

Python_面向对象

面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它将数据和操作数据的方法组合在一起&#xff0c;以便将数据和行为视为一个整体。这种编程范式的历程可以追溯到20世纪60年代&#xff0c;但直到80年代才开始流行。…

机器人过程自动化(RPA)入门 8. 异常处理、调试和日志记录

有时,自动化程序可能无法执行。为了处理此类情况,我们使用异常处理活动。在本章中,我们将从UiPath中可用的各种类型的异常处理方法、您可能遇到的异常以及如何处理它们开始。我们还将学习日志记录。本章涉及的一个重要主题是调试,以检查工作流是否正常工作,并更正任何错误…

【C语言数据结构】栈-链式存储(链栈)

栈-链式存储-链栈 代码实现 代码实现 #include<stdio.h> #include<stdlib.h> #include<stdbool.h>#define ElemType char//定义链栈结构体&#xff0c;并规定栈顶就是链头&#xff0c;一切操作只能在链头进行 typedef struct LNode {//定义数据&#xff0c;…

【租车骑绿道】python实现-附ChatGPT解析

1.题目 租车骑绿道 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 部门组织绿道骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、做大载重M。 给出部门每个人的体重,请问最多需要租用多少双人自行车 输入描述 第一行两个数字m、n,自行车限重m,代表部门总…

​为什么流利的英语对于机器学习比数学或编程更重要

​为什么流利的英语对于机器学习比数学或编程更重要 我需要你的帮助&#xff0c;因为我来自多元化的背景&#xff0c;意味着我改变了自己的领域&#xff0c;首先我在学士学位&#xff0c;但后来我转到了和机器学习&#xff0c;这对我来说是新的&#xff0c;但我最终完成了。 …

[管理与领导-107]:IT人看清职场中的隐性规则 - 4 - 职场话术:其实是同一个意思,只是换一种了说法,效果不同,小心被套路

目录 前言&#xff1a; 一、套路和核心思想 1.1 核心思想 1.2 基本原则&#xff1a;让听话者舒服 二、消极变积极的说法 》 自足当下&#xff0c;展望未来 三、委婉拒绝 四、不想接受某项任务 五、正面、让人舒服的表达方式 六、其他 七、职场话术128条&#xff1a;…