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

成都蜀美网站建设企业网站设计沈阳

成都蜀美网站建设,企业网站设计沈阳,知名网站建设公司 北京,旅游网站建设的背景意义两个客户端实现聊天功能#xff0c;那么服务器作转发信息的作用#xff0c;客户端A先将信息发送到服务器#xff0c;在由服务器将信息发送到客户端B#xff0c;客户端B也是一样。客户端与服务器都应该有两个执行流#xff0c;服务器的一个执行流不断的接收客户端A的信息并…两个客户端实现聊天功能那么服务器作转发信息的作用客户端A先将信息发送到服务器在由服务器将信息发送到客户端B客户端B也是一样。客户端与服务器都应该有两个执行流服务器的一个执行流不断的接收客户端A的信息并将其发送给客户端B另一个执行流不断地接收客户端B的信息并将其发送给客户端A而客户端的两个执行流分别做读信息操作和写信息操作。这是我们的常规思维如果用单线程的方法有该如何做呢 socket称之为网络套接字但其实也是一个文件描述符这个文件描述符被默认为阻塞状态accept函数如果没有客户端与之相连就一直阻塞在这里程序不会在执行下去read函数也是一样如果从缓冲区中没有读到数据就会被阻塞直到读到数据时才能退出这个函数。如下图clientA向server发送一个data1,server读到了这个data1后在发送给clientB如果clientA并没有发送信息此时read函数就会阻塞函数卡在read函数这那么此时如果clientB发来一个data2server根本读不到但是这个data2已经放在了缓冲区里当clientA发来消息后read函数便不再阻塞并将这条消息发送给clientB此时server才能从缓冲区里读到data2。 既然是默认为阻塞那么也可以设置为非阻塞在非阻塞状态下read函数读到数据就返回所读取数据的个数没有读到数据就立即返回0此时便不会出现无法发送数据或者发完数据后才接收到上一条信息。 我们可用如下方法设置阻塞 #include unistd.h #include fcntl.h int flagsfcntl(sockid,F_GETFL,0); fcntl(sockid,F_SETFL,flags|O_NONBLOCK);sockid表示套接字也是文件描述符想要设置谁非阻塞就填谁的套接字 设置非阻塞方法 #include unistd.h #include fcntl.h int flagsfcntl(sockid,F_GETFL,0); fcntl(sockid,F_SETFL,flags~O_NONBLOCK);服务器 #include stdio.h #include time.h #include fcntl.h #include sys/select.h #include string.h #include unistd.h #include malloc.h #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h#define clientA 0 #define clientB 1 #define max_client 2 //最大连接客户端数量typedef struct clientNew {char *addr;int sockid;uint16_t port; }client_new;//存放所连客户端的地址和socket等信息void client_new_init(client_new c_new[]) {int i0;for(;imax_client;i){c_new[i].addrNULL;c_new[i].sockid0;c_new[i].port0;} }void setsocket_noblock(client_new c_new[]) {//设置所连的两个客户端socket非阻塞int flagsfcntl(c_new[clientA].sockid,F_GETFL,0);fcntl(c_new[clientA].sockid,F_SETFL,flags|O_NONBLOCK);flagsfcntl(c_new[clientB].sockid,F_GETFL,0);fcntl(c_new[clientB].sockid,F_SETFL,flags|O_NONBLOCK); }void read_clientA(client_new c_new[],int *flag) {char receive[100]{0};if(read(c_new[clientA].sockid,receive,sizeof(receive))0)//读取A客户端信息如果没读到数据就返回0{time_t timep;//获取A客户端发来信息的时间time(timep);if(strcmp(receive,quit\n)0)//如果A客户端发来quit先把quit发给B客户端在结束聊天{printf(ip%s %s 用户发起退出\n,c_new[clientA].addr,ctime(timep));write(c_new[clientB].sockid,receive,strlen(receive));usleep(1000);*flag0;return ;}printf(ip%s %s: ,c_new[clientA].addr,ctime(timep));printf(%s\n,receive);write(c_new[clientB].sockid,receive,strlen(receive));//将A客户端发来的信息转发给B客户端} }void read_clientB(client_new c_new[],int *flag) {char receive[100]{0};if(read(c_new[clientB].sockid,receive,sizeof(receive))0)//读取B客户端信息如果没读到数据就返回0{time_t timep;time(timep);if(strcmp(receive,quit\n)0){printf(ip%s %s 用户发起退出\n,c_new[clientA].addr,ctime(timep));write(c_new[clientA].sockid,receive,strlen(receive));usleep(1000);*flag0;return ;}printf(ip%s: %s:,c_new[clientB].addr,ctime(timep));printf(%s\n,receive);write(c_new[clientA].sockid,receive,strlen(receive));//将B客户端发来的信息转发给A客户端} }void communication(client_new c_new[],int server_sockid) { int flag1;while(flag){read_clientA(c_new,flag);read_clientB(c_new,flag);}close(server_sockid); }int internet(client_new c_new[]) {struct sockaddr_in sockaddr;sockaddr.sin_familyAF_INET;sockaddr.sin_porthtons(5188);sockaddr.sin_addr.s_addrhtonl(INADDR_ANY);int server_sockidsocket(AF_INET,SOCK_STREAM,0);const int on1;if(setsockopt(server_sockid,SOL_SOCKET,SO_REUSEADDR,on,sizeof(on))0)//设置端口可重复利用{printf(setsockopt\n);return 0;}if(bind(server_sockid,(struct sockaddr *)sockaddr,sizeof(sockaddr))0){printf(bind\n);return 0;}if(listen(server_sockid,SOMAXCONN)0){printf(listen\n);return 0;}struct sockaddr_in other_sock_addr;socklen_t other_sock_addr_lensizeof(other_sock_addr);int j0;while(j!max_client)//连接两个客户端{int sockid_clientaccept(server_sockid,(struct sockaddr *)other_sock_addr,other_sock_addr_len);c_new[j].sockid sockid_client;c_new[j].addrinet_ntoa(other_sock_addr.sin_addr);c_new[j].portntohs(other_sock_addr.sin_port);printf(ip%s,port%d 已连接\n,c_new[j].addr,c_new[j].port);j;}return server_sockid; }int main() {client_new c_new[max_client]; //定义结构体数组client_new_init(c_new); //初始化结构体数组int server_sockidinternet(c_new); //网络连接并返回服务器socketsetsocket_noblock(c_new); //设置所连的两个客户端socket非阻塞communication(c_new,server_sockid); //通信return 0; }客户端 #include stdio.h #include string.h #include unistd.h #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #include fcntl.h #include sys/stat.hvoid do_read(int sockid,int *flag) {char receive[100]{0};int r_sizeread(sockid,receive,sizeof(receive));if(strcmp(receive,quit\n)0){printf(对方已结束聊天\n);*flag0;return;}if(r_size0){printf(\t\t\t);fputs(receive,stdout);} }void do_write(int sockid,int *flag) {char send[100]{0};int w_sizeread(0,send,sizeof(send));if(strcmp(send,quit\n)0){printf(您已下线\n);write(sockid,send,sizeof(send));*flag0;return;}if(w_size0){write(sockid,send,sizeof(send));memset(send,0,strlen(send));} }int internet() {int flag1;struct sockaddr_in addr;addr.sin_familyAF_INET;addr.sin_porthtons(5188);addr.sin_addr.s_addrinet_addr(127.0.0.1);int sockidsocket(AF_INET,SOCK_STREAM,0);socklen_t addrlensizeof(addr);if(connect(sockid,(struct sockaddr *)addr,addrlen)0){printf(connect\n);return 0;}int flagsfcntl(sockid,F_GETFL,0);fcntl(sockid,F_SETFL,flags|O_NONBLOCK);flagsfcntl(0,F_GETFL,0);fcntl(0,F_SETFL,flags|O_NONBLOCK);while(flag){do_read(sockid,flag);do_write(sockid,flag);}close(sockid);return 0; }int main() {internet();return 0; }以上程序只能实现局域网内通信。实现跨局域网聊天请点击
http://www.sadfv.cn/news/43836/

相关文章:

  • 南山做网站教程漯河seo
  • 免费刷赞网站推广qq免费wordpress 仿百度模板
  • 三门峡市建设局官方网站wordpress新建header
  • 上海行业网站建设陕西省建设厅八大员证
  • perl网站开发石家庄最新招聘信息
  • 西安知名网站开发的公司湖南网站推广多少钱
  • fla可以做网站么两个公司的网站建设
  • 做网站时怎样图片上传怎么才能让图片不变形有什么插件吗淘宝网上购物平台
  • 网站设计语言有哪些做网站 用asp
  • 网站下载免费软件广州软件开发人力外包价格
  • 洛阳制作网站公司哪家好做外贸主页网站用什么的空间好点
  • 简单网站建设流程做宠物的网站
  • 专做动漫的网站网站维护的内容有哪些
  • 网站开发的方法和步骤做网站前期预算
  • 网页设计论文html西安seo包年服务
  • 互动类网站百度下载app下载安装
  • 免费开源门户网站系统庆阳网站哪里做
  • 冬青街 做网站在线logo设计免费生成器
  • 网站关键词优化互点做招聘信息的网站有哪些内容
  • 门户网站的基本特征有网站建设的素材整理论文
  • 网站空间空间中国建筑官网超高层
  • 网站开发进度报告网页开发平台
  • 网站开发建议菏泽住房和城乡建设部网站
  • 奉化建设网站网站购买云空间
  • 安全的南昌网站制作如何规避电子政务门户网站建设教训
  • 广州排名网站关键词优化济南建网站价格消费品展
  • aitt网站建设中装修行业在什么网站上做推广好
  • 小蚁人网站建设娱乐游戏网站建设
  • 毕业设计做网站答辩中国500强企业排行榜
  • 网站在政务新媒体建设广东网站建设方案