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

如何学习网站开发常州网站关键字优化

如何学习网站开发,常州网站关键字优化,wordpress metakey,有哪些学做衣服的网站有哪些半关闭、端口复用 半关闭只能实现数据单方向的传输#xff1b;当TCP 接中A向 B 发送 FIN 请求关闭#xff0c;另一端 B 回应ACK 之后 (A 端进入 FIN_WAIT_2 状态)#xff0c;并没有立即发送 FIN 给 A#xff0c;A 方处于半连接状态 (半开关)#xff0c;此时 A 可以接收 B… 半关闭、端口复用 半关闭只能实现数据单方向的传输当TCP 接中A向 B 发送 FIN 请求关闭另一端 B 回应ACK 之后 (A 端进入 FIN_WAIT_2 状态)并没有立即发送 FIN 给 AA 方处于半连接状态 (半开关)此时 A 可以接收 B 发送的数据但是 A 已经不能再向 B 发送数据 close不会影响到其他进程shutdown会影响到其他进程 网络信息相关的命令 netstat -a 所有的Socket -p 正在所用socket的程序名称 -n 直接使用IP地址不通过域名服务器 端口复用 1. 防止服务器重启时之前绑定的端口还没释放 2. 程序突然退出而系统没有释放端口 IO多路复用简介 I/O多路复用使程序可以同时监听多个文件描述符提高程序性能select/poll/epoll 阻塞等待不占用CPU宝贵时间但同一时刻只能处理一个操作效率低。 非阻塞忙轮询提高了程序执行效率但会占用更多的CPU资源。 select/poll委托内核进行检测但仍需要进行遍历 epoll同样委托内核但无需进行遍历 select 主旨思想 1. 构造关于文件描述符的列表将要监听的文件描述符添加到表中 2. 调用系统函数监听该列表中的文件描述符知道描述符中的一个/多个进行了I/O操作函数才返回该函数是阻塞的且该函数对于文件描述符的检测是由内核完成的 3. 返回时告诉进程有多少描述符要进行I/O操作 返回值 失败 - -1成功 - 检测到的描述符个数 #include iostream #include cstdio #include arpa/inet.h #include cstdlib #include string.h #include sys/select.h #include unistd.husing namespace std;int main(){// 创建socketint lfd socket(PF_INET , SOCK_STREAM , 0);struct sockaddr_in saddr;saddr.sin_port htons(9999);saddr.sin_family AF_INET;saddr.sin_addr.s_addr INADDR_ANY;// 绑定bind(lfd , (struct sockaddr*)saddr , sizeof(saddr));// 监听listen(lfd , 8);fd_set rdset , tmp;FD_ZERO(rdset);FD_SET(lfd , rdset);int maxfd lfd1;while(1){tmp rdset;// 调用select 系统检测int ret select(maxfd1 , tmp , NULL , NULL , NULL);if(ret -1){perror(select);exit(-1);}else if(ret 0){continue;}else{// 检测到了文件描述符的数据发生了改变if(FD_ISSET(lfd , tmp)){// 有客户端连接进来struct sockaddr_in caddr;socklen_t len sizeof(caddr);int cfd accept(lfd , (struct sockaddr*)caddr , len);// 添加进去FD_SET(cfd , rdset);maxfd maxfdcfd?maxfd:cfd1;}for(int i lfd1 ; i maxfd ; i){if(FD_ISSET(i , tmp)){// 说明客户端发来了数据char buf[1024];int len read(i , buf , sizeof(buf));if(len -1){perror(read);exit(-1);}else if(len 0){coutclient close...endl;close(i);FD_CLR(i,rdset);}else{cout发来了数据bufendl;write(i , buf , strlen(buf)1);}}}}}close(lfd);return 0; } poll #include iostream #include cstdio #include arpa/inet.h #include cstdlib #include string.h #include poll.h #include unistd.husing namespace std;int main(){// 创建socketint lfd socket(PF_INET , SOCK_STREAM , 0);struct sockaddr_in saddr;saddr.sin_port htons(9999);saddr.sin_family AF_INET;saddr.sin_addr.s_addr INADDR_ANY;// 绑定bind(lfd , (struct sockaddr*)saddr , sizeof(saddr));// 监听listen(lfd , 8);// 初始化检测文件描述符数组struct pollfd fds[1024];for(int i 0 ; i1024 ; i){fds[i].fd -1;fds[i].events POLLIN;}fds[0].fd lfd;int nfds 0;while(1){// poll 系统检测int ret poll(fds , nfds1 , -1);if(ret -1){perror(poll);exit(-1);}else if(ret 0){continue;}else{// 检测到了文件描述符的数据发生了改变if(fds[0].revents POLLIN){// 有客户端连接进来struct sockaddr_in caddr;socklen_t len sizeof(caddr);int cfd accept(lfd , (struct sockaddr*)caddr , len);// 添加进去for(int i 1 ; i 1024 ; i){if(fds[i].fd -1){fds[i].fd cfd;fds[i].events POLLIN;break;}}nfds nfdscfd?nfds:cfd;}for(int i 1 ; i nfds ; i){if(fds[i].revents POLLIN){// 说明客户端发来了数据char buf[1024];int len read(fds[i].fd , buf , sizeof(buf));if(len -1){perror(read);exit(-1);}else if(len 0){coutclient close...endl;close(fds[i].fd);fds[i].fd -1;}else{cout发来了数据bufendl;write(fds[i].fd , buf , strlen(buf)1);}}}}}close(lfd);return 0; } epoll 内核红黑树记录要检测的文件描述符避免了用户态到内核态的数据拷贝开销 内核双链表存放数据改变的文件描述符 #include iostream #include cstdio #include arpa/inet.h #include cstdlib #include string.h #include sys/epoll.h #include unistd.husing namespace std;int main(){// 创建socketint lfd socket(PF_INET , SOCK_STREAM , 0);struct sockaddr_in saddr;saddr.sin_port htons(9999);saddr.sin_family AF_INET;saddr.sin_addr.s_addr INADDR_ANY;// 绑定bind(lfd , (struct sockaddr*)saddr , sizeof(saddr));// 监听listen(lfd , 8);// 创建epoll实例int epfd epoll_create(100);// 添加监听文件描述符struct epoll_event epev;epev.events EPOLLIN;epev.data.fd lfd;epoll_ctl(epfd , EPOLL_CTL_ADD , lfd , epev);struct epoll_event epevs[1024];while(1){int ret epoll_wait(epfd , epevs , 1024 , -1);if(ret -1){perror(epoll);exit(-1);}coutret个发生了改变endl;for(int i 0 ; iret ; i){int curfd epevs[i].data.fd;if(curfd lfd){// 监听的文件描述符有客户端连接struct sockaddr_in caddr;socklen_t len sizeof(caddr);int cfd accept(lfd , (struct sockaddr*)caddr , len);epev.events EPOLLIN;epev.data.fd cfd;epoll_ctl(epfd , EPOLL_CTL_ADD , cfd , epev);}else{// 有数据到达char buf[1024];int len read(curfd , buf , sizeof(buf));if(len -1){perror(read);exit(-1);}else if(len 0){coutclient close...endl;epoll_ctl(epfd , EPOLL_CTL_DEL , curfd , NULL);close(curfd);}else{cout发来了数据bufendl;write(curfd , buf , strlen(buf)1);}}}}close(lfd);close(epfd);return 0; } epoll的两种工作模式 LT模式 - 水平触发 默认的工作模式支持block/no-block内核告诉你一个文件描述符是否就绪了然后你可以对这个就绪的 fd 进行IO操作。如果你不作任何操作内核还是会继续通知你 #include iostream #include cstdio #include arpa/inet.h #include cstdlib #include string.h #include sys/epoll.h #include unistd.husing namespace std;int main(){// 创建socketint lfd socket(PF_INET , SOCK_STREAM , 0);struct sockaddr_in saddr;saddr.sin_port htons(9999);saddr.sin_family AF_INET;saddr.sin_addr.s_addr INADDR_ANY;// 绑定bind(lfd , (struct sockaddr*)saddr , sizeof(saddr));// 监听listen(lfd , 8);// 创建epoll实例int epfd epoll_create(100);// 添加监听文件描述符struct epoll_event epev;epev.events EPOLLIN;epev.data.fd lfd;epoll_ctl(epfd , EPOLL_CTL_ADD , lfd , epev);struct epoll_event epevs[1024];while(1){int ret epoll_wait(epfd , epevs , 1024 , -1);if(ret -1){perror(epoll);exit(-1);}coutret个发生了改变endl;for(int i 0 ; iret ; i){int curfd epevs[i].data.fd;if(curfd lfd){// 监听的文件描述符有客户端连接struct sockaddr_in caddr;socklen_t len sizeof(caddr);int cfd accept(lfd , (struct sockaddr*)caddr , len);epev.events EPOLLIN;epev.data.fd cfd;epoll_ctl(epfd , EPOLL_CTL_ADD , cfd , epev);}else{// 有数据到达char buf[5];int len read(curfd , buf , sizeof(buf));if(len -1){perror(read);exit(-1);}else if(len 0){coutclient close...endl;epoll_ctl(epfd , EPOLL_CTL_DEL , curfd , NULL);close(curfd);}else{cout发来了数据bufendl;write(curfd , buf , strlen(buf)1);}}}}close(lfd);close(epfd);return 0; } ET模式 - 边沿触发 告诉工作方式只支持no-block在这种模式下当描述符从未就绪变为就绪时内核通过epol告诉你。然后它会假设你知道文件描述符已经就绪并且不会再为那个文件描述符发送更多的就绪通知直到你做了某些操作导致那个文件描述符不再为就绪状态了。但是请注意如果一直不对这个 fd 作IO操作内核不会发送更多的通知 (only once) 。但是缓冲区中的数据不会丢失 ET模式效率比LT模式高ET模式下必须使用非阻塞套接口避免由于一个描述符的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死 要设置边沿触发 1. 需要在epoll_event中设置EPOLLET 2.  UDP通信实现 - 无需多进程/多线程的并发实现 // server #include iostream #include stdio.h #include arpa/inet.h #include unistd.h #include string.h #include stdlib.h using namespace std;int main(){// 创建socketint fd socket(PF_INET , SOCK_DGRAM , 0);if(fd -1){perror(socket);exit(-1);}// 绑定struct sockaddr_in addr;addr.sin_family AF_INET;addr.sin_port htons(9999);addr.sin_addr.s_addr INADDR_ANY;int ret bind(fd ,(struct sockaddr*) addr , sizeof(addr));if(ret -1){perror(bind);exit(-1);}// 通信while(1){// 接收数据char buf[128];char ip[16];struct sockaddr_in caddr;socklen_t len sizeof(caddr);int num recvfrom(fd , buf , sizeof(buf) , 0 , (struct sockaddr*)caddr , len);string s1 IP: ;s1 inet_ntop(AF_INET , caddr.sin_addr.s_addr , ip , sizeof(ip));string s2 Port: ;s2 ntohs(caddr.sin_port);couts1 s2endl;coutrcv data: bufendl;sendto(fd , buf , strlen(buf)1 , 0 , (struct sockaddr*)caddr , len);}close(fd);return 0; } // client #include iostream #include stdio.h #include arpa/inet.h #include unistd.h #include string.h #include stdlib.h using namespace std;int main(){// 创建socketint fd socket(PF_INET , SOCK_DGRAM , 0);if(fd -1){perror(socket);exit(-1);}struct sockaddr_in addr;addr.sin_family AF_INET;addr.sin_port htons(9999);inet_pton(AF_INET , 127.0.0.1 , addr.sin_addr.s_addr);// 通信int num 0;socklen_t len sizeof(addr);while(1){char buf[128];sprintf(buf , hello 647 %d , num);sendto(fd , buf , strlen(buf)1 , 0 , (struct sockaddr*)addr , len);// 接收数据int num recvfrom(fd , buf , sizeof(buf) , 0 , NULL , NULL);coutrcv data: bufendl;sleep(1);}close(fd);return 0; } 广播和组播 - 只能使用UDP 广播 - 向子网中多台计算机发送消息每个广播消息都包含一个特殊的IP地址这个IP中子网内主机标志部分的二进制全部为1 1. 只能在局域网中使用 2. 客户端需要绑定服务器广播使用的端口才能接收到广播消息 组播 多播 - 标识一组IP接口是在单播和广播之间的一种折中方案多播数据包只由对其感兴趣的接口接收 1. 组播可以用于局域网和广域网 2. 客户端需要加入多播组才能接收到 本地套接字通信 作用用于进程间的通信实现流程和网络套接字类似一般采用TCP的通信流程 服务器端1. 创建监听的套接字int lfd socketAF_UNIX/AF_LOCAL SOCK_STREAM , 0;2. 监听套接字绑定本地的套接字文件struct sockaddr_un addr;bind(lfd, addr, len); // 绑定成功后sun_path中的套接字文件会自动生成3. 监听4. 等待并接受客户端请求5. 通信6. 关闭连接 客户端1. 创建通信的套接字2. 绑定本地IP端口3. 连接服务器4. 通信5. 关闭连接 // 服务端 #include iostream #include stdio.h #include arpa/inet.h #include unistd.h #include string.h #include stdlib.h #include sys/un.h using namespace std;int main(){unlink(server.sock);// 创建监听套接字int lfd socket(AF_LOCAL , SOCK_STREAM , 0);if(lfd -1){perror(socket);exit(-1);}// 绑定本地套接字文件struct sockaddr_un addr;addr.sun_family AF_LOCAL;strcpy(addr.sun_path , server.sock);int ret bind(lfd , (struct sockaddr*)addr , sizeof(addr));if(ret -1){perror(bind);exit(-1);}// 监听ret listen(lfd , 100);if(ret -1){perror(listen);exit(-1);}// 等待客户端连接struct sockaddr_un caddr;socklen_t len sizeof(caddr);int cfd accept(lfd , (struct sockaddr*)caddr , len);if(cfd -1){perror(accept);exit(-1);}cout客户端文件caddr.sun_pathendl;// 通信while(1){char buf[128];int len recv(cfd , buf , sizeof(buf) , 0);if(len -1){perror(recv);exit(-1);}else if(len 0){coutclient close...endl;break;}else{coutrecv data: bufendl;send(cfd , buf , len , 0);}}close(cfd);close(lfd);return 0; } // 客户端 #include iostream #include stdio.h #include arpa/inet.h #include unistd.h #include string.h #include stdlib.h #include sys/un.h using namespace std;int main(){unlink(client.sock);// 创建监听套接字int cfd socket(AF_LOCAL , SOCK_STREAM , 0);if(cfd -1){perror(socket);exit(-1);}// 绑定本地套接字文件struct sockaddr_un addr;addr.sun_family AF_LOCAL;strcpy(addr.sun_path , client.sock);int ret bind(cfd , (struct sockaddr*)addr , sizeof(addr));if(ret -1){perror(bind);exit(-1);}// 连接服务器struct sockaddr_un saddr;saddr.sun_family AF_LOCAL;strcpy(saddr.sun_path , server.sock);ret connect(cfd , (struct sockaddr*)saddr , sizeof(saddr));if(ret -1){perror(connect);exit(-1);}// 通信int num 0;while(1){char buf[128];sprintf(buf , hello 647 %d\n , num);send(cfd , buf , strlen(buf)1 , 0);int len recv(cfd , buf , sizeof(buf) , 0);if(len -1){perror(recv);exit(-1);}else if(len 0){coutServer close...endl;break;}else{coutrecv data: bufendl;}sleep(1);}close(cfd);return 0; }
http://www.zqtcl.cn/news/642552/

相关文章:

  • 网站推广和优化教程上海网络科技有限公司招聘
  • 即墨建网站价格商城二次开发
  • 网站排名易下拉教程怎么做网店运营
  • 聊城做网站公司聊城博达海外服务器租用多少钱一年
  • 手机上网站做国外销售都上什么网站
  • 网站建设与管理报告书做电销有什么资料网站
  • 网站建设哪家最好企业商城网站建设方案
  • 舟山市建设工程质量监督站网站网页版微信二维码加载失败
  • 金融网站html5模板给自己家的公司做网站好做吗
  • 新农村建设投诉在哪个网站上海做电缆桥架的公司网站
  • 免费行情100个软件网络优化论文
  • asp.net动态的网站开发个人业务网站带后台
  • 控制网站的大量访问关于实验室建设的英文网站
  • 中国容桂品牌网站建设怎么自己做个网站做链接跳转
  • 安徽省建设工程协会网站昆明官网seo厂家
  • 品牌整合推广搜狗优化好的网站
  • 娄底手机网站制作深圳网站建设怎么做
  • 好的龙岗网站建设附近装修公司电话和地址
  • 网站后台生成文章很慢网络营销毕业设计
  • 如何把资料上传到网站什么叫高端网站定制
  • 郑州企业网站建设团队什么是交换链接
  • 如何建立一个外贸公司网站活动营销的方式有哪些
  • 上海工程造价咨询公司余姚网站seo运营
  • 小加工厂做网站wordpress免费主题破解版
  • 网站打开风险怎么解决企业建设网站网站建设公司
  • 随州网站建设公司wordpress怎样上传主题
  • 做外链等于网站更新么台州椒江网站建设
  • 自己搭建一个博客网站网络营销是什么大类
  • 10元网站备案php企业网站开发实训报告
  • 建筑网站设计大全wordpress模板死循环