当前位置: 首页 > news >正文

免费网站在哪里申请表搜索关键词是什么意思

免费网站在哪里申请表,搜索关键词是什么意思,现在 做网站 最流行,大连网站建设设计公司哪家好思维导图 以select函数模型为例 思维导图2 对应 epoll模型 应使用的函数 题目 使用epoll函数实现 两个客户端 通过服务器 实现聊天 思路 在原先代码基础上 实现 服务器 发向 客户端 使用客户端在服务器上的 套接字描述符 实现 客户端 接收 服务器…

思维导图        以select函数模型为例

思维导图2        对应 epoll模型 应使用的函数

题目

使用epoll函数实现 两个客户端 通过服务器 实现聊天

思路

在原先代码基础上

        实现 服务器 发向 客户端                使用客户端在服务器上的 套接字描述符 

        实现 客户端 接收 服务器消息        发向服务器的描述符 也可以用于读取服务器传来数据

实现通信

【1】客户端与服务器连接后,会被分配一个唯一的、不变的id号,直到本次连接断开前,此id号不会被改变或者销毁;

【2】服务器根据 收到的 PACK包中的 pack.type 参数,确定转发目标;        

【3】通过这个唯一id,服务器可以实现数据向 指定目标 的发送;

代码

服务器

struct PACK
{int size;	//数据包大小int type;	//对数据的操作char buf[1500];	//数据int conut;	//数据已经占用多少字节
};enum
{//以下参数适用于 client_id_ctl() 函数的 int cmd 参数insect_clinet=1,	//分配客户端id号 的指令get_client_id,		//获取客户端id号 的指令get_clinetfd,		//获取客户端描述符 的指令remove_clinet,		//移除客户端 的指令//以下参数适用于 数据包的 pack.type 值 send_to_server=-1,	//说明数据是发送向服务器的
};//客户端id号 操作函数//根据cmd不同,实现分配id 获取id 获取描述符 移除id等功能
int client_id_ctl(int arr[],int len,int cmd,int client);
//解析数据
void unlood(struct PACK *pack);int main(int argc, const char *argv[])
{int client_arr[10];	//用于存放 客户端在服务器 上的文件描述符memset(client_arr,-1,sizeof(client_arr));//创建服务器套接字int serverfd=socket(AF_INET,SOCK_STREAM,0);//创建并设置 "网络通信结构体"struct sockaddr_in addr;addr.sin_family=AF_INET;	//ipv4int port=atoi(argv[1]);addr.sin_port=htons(port);	//端口号 (大端存储)addr.sin_addr.s_addr=inet_addr("0.0.0.0");//套接字 绑定 ip 和 portint res=bind(serverfd,(struct sockaddr*)&addr,sizeof(addr));if(res==-1){printf("服务器 绑定ip和port 失败\n");perror("bind");return 0;}printf("服务器已就绪\n");//监听listen(serverfd,10);//创建动态的监视列表int epfd=epoll_create1(EPOLL_CLOEXEC);//设定 需要监视的描述符 以及 激活形式struct epoll_event event_serverfd={.events=EPOLLIN,.data.fd=serverfd};struct epoll_event event_stdinfd={.events=EPOLLIN,.data.fd=0};//添加到 [监视列表]epoll_ctl(epfd,EPOLL_CTL_ADD,serverfd,&event_serverfd);epoll_ctl(epfd,EPOLL_CTL_ADD,0,&event_stdinfd);while(1){struct epoll_event active_list[10];    //用于存放被激活的描述符//开始监视 [监视列表]中描述符int len=epoll_wait(epfd,active_list,10,-1);    //被激活的描述符 在 active_list[10]数组中//遍历被激活的描述符for(int i=0;i<len;i++){int active_fd=active_list[i].data.fd;   //获取被激活的描述符fd//如果是服务器可读 说明有用户尝试连接if(active_fd==serverfd){//接收客户端连接int clientfd=accept(serverfd,NULL,NULL);//为客户端 分配id号int id=client_id_ctl(client_arr,10,insect_clinet,clientfd);// //将客户端 添加到 [监视列表]struct epoll_event event_client={.events=EPOLLIN,.data.fd=clientfd};epoll_ctl(epfd,EPOLL_CTL_ADD,clientfd,&event_client);printf("服务器提示: 有新的客户端连接到服务器 分配id号:%d\n\n",id);}//如果数据来自 终端else if(active_fd==0){printf("服务器提示:NULL");while(getchar()!=10);printf("\n");}//其他情况:数据来自客户端else{/***********************************数据读取部分***********************************///获取该客户端id号int active_id=client_id_ctl(client_arr,10,get_client_id,active_fd);struct PACK pack={0};int res=read(active_fd,&pack.size,4);if(res==0){printf("服务器提示:%d#用户断开连接\n",active_id);//[监视列表] 中 删除该描述夫epoll_ctl(epfd,EPOLL_CTL_DEL,active_fd,&event_serverfd);//移除该用户idclient_id_ctl(client_arr,10,remove_clinet,active_id);close(active_fd);continue;}read(active_fd,(char *)&pack+4,pack.size-4);/***********************************数据处理部分***********************************///根据PACK包中的 tyoe 决定对数据的操作if(pack.type==send_to_server){//说明 数据发向服务器 在服务器解析printf("服务器提示:%d#用户发来数据\n",active_id);unlood(&pack);	//解析数据}else if(pack.type>=0&&pack.type<10){//说明 数据需要转发给其他客户端printf("服务器提示:%d#用户发来数据 数据转发给%d#用户\n",active_id,pack.type);//获取 转发目标 的描述符int target_fd=client_id_ctl(client_arr,10,get_clinetfd,pack.type);//数据转发pack.type=active_id;write(target_fd,&pack,pack.size);		//数据发送给 转发目标}}}}return 0;
}int client_id_ctl(int arr[],int len,int cmd,int client)
{static int sum_client=0;//分配客户端id号if(cmd==insect_clinet){static int new_client_id=0;		//循环未使用的方式 给新增的客户端编号if(sum_client==10){printf("连接的客户端达到上限 \n");return -1;}//定位到 未使用的下标 未使用则数组的值为-1while (arr[new_client_id]%len!=-1){new_client_id=(new_client_id+1)%len;	//循环查找}arr[new_client_id]=client;	//将客户端描述符存入数组sum_client++;return new_client_id;}//获取客户端id号else if (cmd==get_client_id){for(int i=0;i<len;i++){if(arr[i]==client){return i;	//返回该客户端id号}}return -1;}//获取指定客户端描述符	根据id号查找else if (cmd==get_clinetfd){int id=client;if(id>=len||id<0){printf("id号不合法\n");return -1;	//删除失败 返回-1}return arr[id];	//成功返回该id号的描述符}//移除客户端id号	根据id号销毁else if (cmd==remove_clinet){int id=client;if(id>=len||id<0){printf("%d#客户端移除失败 id号不合法\n",id);return -1;	//删除失败 返回-1}arr[client]=-1;sum_client--;return id;		//删除成功 返回删除的id号}
}void unlood(struct PACK *pack)
{int len;while(1){//读取2个字节len=*(short *)(pack->buf+pack->conut);if(len==0){printf("数据解析完毕\n\n");return;}pack->conut+=2;//读取字符串char data[len+1];memset(data,0,sizeof(data));memcpy(data,pack->buf+pack->conut,len);printf("数据:%s\n",data);pack->conut+=len;}printf("数据解析完毕\n");
}

客户端

struct PACK
{int size;	//数据包大小int type;	//对数据的操作char buf[1500];	//数据int conut;	//数据已经占用多少字节
};//数据附加 放入数据
void append(struct PACK* pack,const char *data);
//解析数据
void unlood(struct PACK *pack);int main(int argc, const char *argv[])
{//创建套接字int clientfd=socket(AF_INET,SOCK_STREAM,0);	//ipv4 tcp形式 自动选择协议//ip地址 和 potr端口号 放入"网络通信结构体"struct sockaddr_in addr;addr.sin_family=AF_INET;	//ipv4int port=atoi(argv[1]);addr.sin_port=htons(port);	//端口号addr.sin_addr.s_addr=inet_addr("127.0.0.1");	//服务器ip地址//结构体数据 写入 套接字int res=connect(clientfd,(struct sockaddr*)&addr,sizeof(addr));if(res==-1){printf("套接字 绑定ip和port 失败\n");perror("bind");return 0;}int epfd=epoll_create1(EPOLL_CLOEXEC);  //创建动态的监视列表//设定 需要监视的描述符 以及 激活形式struct epoll_event event_serverfd={.events=EPOLLIN,.data.fd=clientfd};struct epoll_event event_stdinfd={.events=EPOLLIN,.data.fd=0};//添加到 [监视列表]epoll_ctl(epfd,EPOLL_CTL_ADD,clientfd,&event_serverfd);epoll_ctl(epfd,EPOLL_CTL_ADD,0,&event_stdinfd);while(1){printf("开始监视\n");struct epoll_event active_list[10];    //用于存放被激活的描述符//开始监视int len=epoll_wait(epfd,active_list,10,-1);    //被激活的描述符 在 active_list[10]数组中//遍历被激活的描述符for(int i=0;i<len;i++){int active_fd=active_list[i].data.fd;   //获取被激活的描述符fdif(active_fd==0){//如果是终端可读struct PACK pack={0};pack.type=-1;	//默认发往终端char buf[20]="";scanf("%19s",buf);printf("\n客户端数据:%s\n",buf);while(getchar()!=10);append(&pack,buf);printf("-----------------------------------\n");printf("对该数据的操作:\n");printf("  >= 0	转发到指定客户端\n");printf("  ==-1	数据发向服务器 服务器显示数据\n");printf("  ==-2	向服务器分配给自己的id号\n");printf("-----------------------------------\n");printf("该数据需要:");scanf("%d",&pack.type);while(getchar()!=10);pack.size=pack.conut+8;	//包实际大小write(clientfd,&pack,pack.size);		//发送给服务器 将接受多少字节pack.conut=0;	//发送完毕 conut 重置}if(active_fd==clientfd){//如果是描述符可读	说明服务器发来消息struct PACK pack={0};int res=read(clientfd,&pack.size,4);if(res==0){printf("与服务器断开连接\n");return 0;}read(clientfd,(char *)&pack+4,pack.size-4);printf("服务器传来一条数据,数据转发自%d#用户\n",pack.type);unlood(&pack);	//解析数据}}}return 0;
}//数据附加 放入数据
void append(struct PACK* pack,const char *data)
{int len=strlen(data);*(short *)(pack->buf+pack->conut)=len;pack->conut+=2;memcpy(pack->buf+pack->conut,data,len);pack->conut+=len;
}
//解析数据
void unlood(struct PACK *pack)
{int len;while(1){//读取2个字节len=*(short *)(pack->buf+pack->conut);if(len==0){printf("数据解析完毕\n\n");return;}pack->conut+=2;//读取字符串char data[len+1];memcpy(data,pack->buf+pack->conut,len);printf("数据:%s\n",data);pack->conut+=len;}printf("数据解析完毕\n");
}

 效果

           


文章转载自:
http://disinfect.sfwd.cn
http://traditionarily.sfwd.cn
http://haloperidol.sfwd.cn
http://blenny.sfwd.cn
http://seminarist.sfwd.cn
http://exaggerative.sfwd.cn
http://otitis.sfwd.cn
http://peritonaeum.sfwd.cn
http://notch.sfwd.cn
http://semichemical.sfwd.cn
http://atm.sfwd.cn
http://dosimeter.sfwd.cn
http://acciaccatura.sfwd.cn
http://declarative.sfwd.cn
http://vitriolize.sfwd.cn
http://dictograph.sfwd.cn
http://stearate.sfwd.cn
http://hers.sfwd.cn
http://recommended.sfwd.cn
http://shipwright.sfwd.cn
http://snicket.sfwd.cn
http://liber.sfwd.cn
http://detent.sfwd.cn
http://grain.sfwd.cn
http://albomycin.sfwd.cn
http://fogyism.sfwd.cn
http://valise.sfwd.cn
http://mashlam.sfwd.cn
http://centuplicate.sfwd.cn
http://troth.sfwd.cn
http://ebn.sfwd.cn
http://polytheism.sfwd.cn
http://presbyterian.sfwd.cn
http://aidant.sfwd.cn
http://moonwalk.sfwd.cn
http://hasten.sfwd.cn
http://waistbelt.sfwd.cn
http://dcs.sfwd.cn
http://futuristic.sfwd.cn
http://vagabondage.sfwd.cn
http://undistracted.sfwd.cn
http://planes.sfwd.cn
http://nankeen.sfwd.cn
http://microfiche.sfwd.cn
http://determinism.sfwd.cn
http://osteopath.sfwd.cn
http://deviled.sfwd.cn
http://ghostwriter.sfwd.cn
http://washington.sfwd.cn
http://filial.sfwd.cn
http://isodrin.sfwd.cn
http://blackheart.sfwd.cn
http://beetroot.sfwd.cn
http://elytrum.sfwd.cn
http://telegnomy.sfwd.cn
http://anemone.sfwd.cn
http://rostrated.sfwd.cn
http://chalcis.sfwd.cn
http://reckoner.sfwd.cn
http://empurple.sfwd.cn
http://dicentric.sfwd.cn
http://occasionality.sfwd.cn
http://downside.sfwd.cn
http://cylindrical.sfwd.cn
http://sedentariness.sfwd.cn
http://immaturity.sfwd.cn
http://trimethadione.sfwd.cn
http://aquanautics.sfwd.cn
http://instauration.sfwd.cn
http://hemimetabolous.sfwd.cn
http://pulsejet.sfwd.cn
http://supremely.sfwd.cn
http://wherefrom.sfwd.cn
http://distorted.sfwd.cn
http://muckworm.sfwd.cn
http://poppethead.sfwd.cn
http://gargle.sfwd.cn
http://countess.sfwd.cn
http://troth.sfwd.cn
http://tankage.sfwd.cn
http://pithily.sfwd.cn
http://admirable.sfwd.cn
http://procession.sfwd.cn
http://yearling.sfwd.cn
http://frivolous.sfwd.cn
http://dripstone.sfwd.cn
http://servia.sfwd.cn
http://ytterbia.sfwd.cn
http://hosepipe.sfwd.cn
http://multinucleate.sfwd.cn
http://cableship.sfwd.cn
http://pippa.sfwd.cn
http://burliness.sfwd.cn
http://galago.sfwd.cn
http://ezra.sfwd.cn
http://kpelle.sfwd.cn
http://phospholipase.sfwd.cn
http://almsgiving.sfwd.cn
http://repellency.sfwd.cn
http://hetmanate.sfwd.cn
http://www.hrbkazy.com/news/85884.html

相关文章:

  • wordpress前台弹窗五年级上册语文优化设计答案
  • 建设银行手机银行网站用户名公司网站开发费用
  • 教学网站制作百度网站大全
  • 大连做网站seo福建百度推广开户
  • 国内外网站建设seo外链平台热狗
  • 沧州商城网站开发设计百度seo优化价格
  • 网站如何做修改密码的相关验证网络营销服务有哪些
  • 智能建站软件哪个好学软件开发学费多少钱
  • 网站建设的基本流程和技术规范软文营销范文100字
  • 东莞大岭山镇疫情最新消息上海好的seo公司
  • 做了网站应该如何推广南京最新消息今天
  • 设计工作室网页设计江苏网站seo设计
  • html5 wap 网站模板查询网站收录
  • 网站建设维护公司资质宁波seo网络推广公司排名
  • 湛江企业建站系统2345浏览器网页版
  • 河南省鹤壁市住房和城乡建设局网站厦门网络关键词排名
  • seo网站排名助手营销方案怎么写模板
  • 重庆网站建设外包哪家好百度网盟推广
  • 深圳有没有可以做家教的网站网站之家查询
  • 数字创意设计包括哪些行业seo技术自学
  • dede企业网站模板华与华营销策划公司
  • 广州网站推广公司厦门网站seo哪家好
  • 上海做宴会的网站站长工具友链查询
  • 企业网站建设可以分为哪些层次如何做好线上营销
  • 石材外贸网站搜索引擎营销sem
  • 微信支付 网站建设百度推广投诉热线
  • 哪些网站做的比较好看的外贸独立站建站
  • wordpress设置html代码深圳谷歌seo推广
  • 聊城做网站的公司案例太原seo排名公司
  • 坪山网站建设哪家便宜乔拓云智能建站