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

软考网站优化关键词排名公司

软考,网站优化关键词排名公司,地方门户网站推广,理财网站建设1. 说明&#xff1a; 此篇博客主要记录一种客户端实现方式&#xff0c;和两种使用poll或者epoll分别创建echo服务器的方式&#xff0c;具体可看代码注释&#xff1a; 2. 相关代码&#xff1a; 2.1 echoClient.cpp #include <iostream> #include <cstdio> #incl…

1. 说明:

此篇博客主要记录一种客户端实现方式,和两种使用poll或者epoll分别创建echo服务器的方式,具体可看代码注释:

2. 相关代码:

2.1 echoClient.cpp
#include <iostream>
#include <cstdio>
#include <cstring>#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>#define ERR_EXIT(m) \do {\perror(m); \exit(EXIT_FAILURE); \} while(0)int main() {int sock;struct sockaddr_in svrAddr, localAddr;socklen_t addrlen = sizeof(sockaddr);sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);if (sock < 0)ERR_EXIT("socket");memset(&svrAddr, 0, sizeof(svrAddr));svrAddr.sin_family = AF_INET;svrAddr.sin_port = htons(8888);svrAddr.sin_addr.s_addr = inet_addr("127.0.0.1");if (connect(sock, (sockaddr *)&svrAddr, sizeof(svrAddr)) < 0)ERR_EXIT("connect");if (getsockname(sock, (sockaddr *)&localAddr, &addrlen) < 0)ERR_EXIT("getsockname");std::cout << "ip = " << inet_ntoa(localAddr.sin_addr)<< " port = " << ntohs(localAddr.sin_port) << std::endl;char sendBuf[1024] = {0};char recvBuf[1024] = {0};while (fgets(sendBuf, sizeof(sendBuf), stdin) != NULL){write(sock, sendBuf, strlen(sendBuf));read(sock, recvBuf, sizeof(recvBuf));fputs(recvBuf, stdout);memset(sendBuf, 0, sizeof(sendBuf));memset(recvBuf, 0, sizeof(recvBuf));}close(sock);return 0;
}
2.2 echoServer_poll.cpp
#include <iostream>
#include <vector>
#include <string>#include <cstdio>
#include <cstring>#include <arpa/inet.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <unistd.h>#include <signal.h>
#include <poll.h>
#include <sys/socket.h>#define ERR_EXIT(m) \do {\perror(m); \exit(EXIT_FAILURE); \} while(0)using PollfdList = std::vector<pollfd>;int main()
{//忽略系统提示的一些错误信号/*signal(para1,para2)para1:信号类型para2:信号处理函数(可以自定义)讲解参考:https://blog.csdn.net/u013271656/article/details/114537411*/signal(SIGPIPE, SIG_IGN);signal(SIGCHLD, SIG_IGN);//创建一个监听套接字(非阻塞套接字)int listenfd;listenfd = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, IPPROTO_TCP);if(listenfd < 0){ERR_EXIT("socket");}//设置地址struct sockaddr_in srvAddr;memset(&srvAddr,0,sizeof(srvAddr));//初始化srvAddr.sin_family = AF_INET;srvAddr.sin_port = htons(8888);srvAddr.sin_addr.s_addr = htonl(INADDR_ANY);//设置地址的重复利用int on = 1;if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0){ERR_EXIT("setsockopt");}//绑定if(bind(listenfd, (sockaddr *)&srvAddr, sizeof(srvAddr)) < 0){ERR_EXIT("bind");}//监听if(listen(listenfd, SOMAXCONN) < 0){ERR_EXIT("listen");}//使用poll并关注pollin事件struct pollfd pfd;pfd.fd = listenfd;pfd.events = POLLIN;//储存poll的描述符PollfdList pollfds;pollfds.push_back(pfd);int nready;struct sockaddr_in peerAddr;socklen_t peerlen;int connfd;int idlefd;//空闲描述符//循环处理while (true) {//取事件nready = poll(pollfds.data(), pollfds.size(), -1);if(nready == -1){if(errno == EINTR){continue;}ERR_EXIT("poll");}else if(nready == 0){continue;}//如果有POLLIN事件if(pollfds[0].revents & POLLIN){//接受peerlen = sizeof(peerAddr);connfd = ::accept4(listenfd, (sockaddr *)&peerAddr, &peerlen, SOCK_NONBLOCK | SOCK_CLOEXEC);//剔除空闲连接if (connfd == -1) {if (errno == EMFILE) {close(idlefd);idlefd = accept(listenfd, NULL, NULL);close(idlefd);idlefd = open("/dev/null", O_RDONLY | O_CLOEXEC);continue;}else ERR_EXIT("accept4");}//加入到监听pfd.fd = connfd;pfd.events = POLL_IN;pfd.revents = 0;pollfds.push_back(pfd);--nready;//连接成功std::cout << "ip = " << inet_ntoa(peerAddr.sin_addr)<< " port = " << ntohs(peerAddr.sin_port) << std::endl;if (nready == 0)continue;}//std::cout << "pollfds size: " << pollfds.size() << std::endl;//std::cout << "nready fds: " << nready << std::endl;//遍历判断哪些套接字产生了事件for (auto it = pollfds.begin() + 1; it != pollfds.end() && nready > 0; ++it) {//如果是可读事件if (it->revents & POLL_IN) {--nready;connfd = it->fd;char buf[1024] = {0};//读取数据int ret = read(connfd, buf, 1024);if (ret == -1)ERR_EXIT("read");if (ret == 0) {std::cout << "client closed" << std::endl;it = pollfds.erase(it);--it;close(connfd);continue;}std::cout << buf << std::endl;//将接收的消息返回给客户端write(connfd, buf, strlen(buf));}}}return 0;
}
2.3 echoServer_epoll.cpp
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>#include <cstdio>
#include <cstring>#include <arpa/inet.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <unistd.h>#include <signal.h>
#include <sys/epoll.h>
#include <sys/socket.h>#define ERR_EXIT(m) \do {\perror(m); \exit(EXIT_FAILURE); \} while(0)using EventList = std::vector<epoll_event>;int main()
{signal(SIGPIPE, SIG_IGN);signal(SIGCHLD, SIG_IGN);//创建一个监听套接字(非阻塞套接字)int listenfd;listenfd = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, IPPROTO_TCP);if(listenfd < 0){ERR_EXIT("socket");}//设置地址struct sockaddr_in srvAddr;memset(&srvAddr,0,sizeof(srvAddr));//初始化srvAddr.sin_family = AF_INET;srvAddr.sin_port = htons(8888);srvAddr.sin_addr.s_addr = htonl(INADDR_ANY);//设置地址的重复利用int on = 1;if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0){ERR_EXIT("setsockopt");}//绑定if(bind(listenfd, (sockaddr *)&srvAddr, sizeof(srvAddr)) < 0){ERR_EXIT("bind");}//监听if(listen(listenfd, SOMAXCONN) < 0){ERR_EXIT("listen");}std::vector<int> clients;int epollfd = epoll_create(EPOLL_CLOEXEC);//使用EPOLLIN并关注EPOLLIN事件struct epoll_event event;event.data.fd = listenfd;event.events = EPOLLIN;epoll_ctl(epollfd, EPOLL_CTL_ADD, listenfd, &event);//储存epoll的描述符EventList events(16);struct sockaddr_in peerAddr;socklen_t peerlen;int connfd;int idlefd;//空闲描述符int nready;//循环处理while (true) {//取事件nready = epoll_wait(epollfd, events.data(), static_cast<int>(events.size()), -1);if(nready == -1){if(errno == EINTR){continue;}ERR_EXIT("epoll_wait");}else if(nready == 0){continue;}if (static_cast<size_t>(nready) == events.size()) {events.resize(events.size() * 2);} for (auto e : events) {if (e.data.fd == listenfd) {peerlen = sizeof(peerAddr);connfd = ::accept4(listenfd, (sockaddr *)&peerAddr, &peerlen, SOCK_NONBLOCK | SOCK_CLOEXEC);if (connfd == -1) {if (errno == EMFILE) {close(idlefd);idlefd = accept(listenfd, NULL, NULL);close(idlefd);idlefd = open("/dev/null", O_RDONLY | O_CLOEXEC);continue;}else ERR_EXIT("accept4");}clients.push_back(connfd);event.data.fd = connfd;event.events = EPOLLIN;epoll_ctl(epollfd, EPOLL_CTL_ADD, connfd, &event);std::cout << " connection from ip = " << inet_ntoa(peerAddr.sin_addr)<< " port = " << ntohs(peerAddr.sin_port) << std::endl;}else if (e.events & EPOLLIN) {connfd = e.data.fd;char buf[1024] = {0};int ret = read(connfd, buf, 1024);if (ret == -1)ERR_EXIT("read");if (ret == 0) {std::cout << "client closed" << std::endl;event = e; epoll_ctl(epollfd, EPOLL_CTL_DEL, connfd, &event);clients.erase(std::remove(clients.begin(), clients.end(), connfd), clients.end());close(connfd);continue;}std::cout << "msg: " << buf << std::endl;write(connfd, buf, strlen(buf));}}}return 0;
}

文章转载自:
http://hypomania.rzgp.cn
http://provolone.rzgp.cn
http://remittee.rzgp.cn
http://falangist.rzgp.cn
http://riverward.rzgp.cn
http://bonanzagram.rzgp.cn
http://nevertheless.rzgp.cn
http://permissivist.rzgp.cn
http://f2f.rzgp.cn
http://molinete.rzgp.cn
http://irreligiously.rzgp.cn
http://dynistor.rzgp.cn
http://wolfling.rzgp.cn
http://surgeonfish.rzgp.cn
http://lollop.rzgp.cn
http://orbiter.rzgp.cn
http://nurturance.rzgp.cn
http://labialization.rzgp.cn
http://exoatmospheric.rzgp.cn
http://irreversible.rzgp.cn
http://cabalism.rzgp.cn
http://perpetually.rzgp.cn
http://castice.rzgp.cn
http://dipole.rzgp.cn
http://exemplar.rzgp.cn
http://externalise.rzgp.cn
http://alchemically.rzgp.cn
http://chronicity.rzgp.cn
http://preponderate.rzgp.cn
http://heterocercal.rzgp.cn
http://buck.rzgp.cn
http://misknow.rzgp.cn
http://chigoe.rzgp.cn
http://airhead.rzgp.cn
http://shaktism.rzgp.cn
http://hamshackle.rzgp.cn
http://indeciduate.rzgp.cn
http://warfront.rzgp.cn
http://prig.rzgp.cn
http://iise.rzgp.cn
http://coffle.rzgp.cn
http://autographically.rzgp.cn
http://rudesby.rzgp.cn
http://thither.rzgp.cn
http://carriage.rzgp.cn
http://smock.rzgp.cn
http://fossilization.rzgp.cn
http://strigil.rzgp.cn
http://spire.rzgp.cn
http://onshore.rzgp.cn
http://hydroperoxide.rzgp.cn
http://tenability.rzgp.cn
http://resiliency.rzgp.cn
http://worryingly.rzgp.cn
http://eponymist.rzgp.cn
http://graticule.rzgp.cn
http://prosperously.rzgp.cn
http://chemoceptor.rzgp.cn
http://tallulah.rzgp.cn
http://truckdriver.rzgp.cn
http://espieglerie.rzgp.cn
http://clc.rzgp.cn
http://fib.rzgp.cn
http://decenary.rzgp.cn
http://rift.rzgp.cn
http://desalinization.rzgp.cn
http://tempera.rzgp.cn
http://bullboat.rzgp.cn
http://estrepe.rzgp.cn
http://pantologic.rzgp.cn
http://creatress.rzgp.cn
http://apogamous.rzgp.cn
http://anthea.rzgp.cn
http://jackfish.rzgp.cn
http://yaren.rzgp.cn
http://exhortatory.rzgp.cn
http://assessor.rzgp.cn
http://peccadillo.rzgp.cn
http://schoolgirl.rzgp.cn
http://ssg.rzgp.cn
http://lovesick.rzgp.cn
http://phraseology.rzgp.cn
http://succumb.rzgp.cn
http://exultantly.rzgp.cn
http://resolvedly.rzgp.cn
http://paesano.rzgp.cn
http://maroquin.rzgp.cn
http://romanaccio.rzgp.cn
http://ovibovine.rzgp.cn
http://footstock.rzgp.cn
http://resurvey.rzgp.cn
http://exophthalmos.rzgp.cn
http://kephalin.rzgp.cn
http://phocomelia.rzgp.cn
http://sporotrichosis.rzgp.cn
http://indigenize.rzgp.cn
http://audacious.rzgp.cn
http://laminar.rzgp.cn
http://shylock.rzgp.cn
http://cooperage.rzgp.cn
http://www.dt0577.cn/news/88707.html

相关文章:

  • 网站建设阐述自动app优化
  • 南宁网站seo公司快速排名刷
  • 做网站常用的小语种有哪些搜索网站排名
  • 网站建设公司武汉网络公关
  • dede做的网站怎样去换模版网络怎样做推广
  • 首码网站免费推广免费发外链的网站
  • 做网站那种布局好互联网舆情信息
  • 宿州网站建设哪家公司好图片优化
  • 德阳网站开发搜狗seo刷排名软件
  • 怎么建立公司网站费用最新app推广项目平台
  • dz网站收款即时到账怎么做的爱站网长尾词挖掘
  • 湖州市南浔区建设局网站推广链接
  • 做网站现在还行吗宣传页面怎么制作
  • 网站的公关和广告活动怎么做万能搜索引擎
  • 我想在泉州做网站北京网络营销咨询公司
  • 北京手机网站制作公司网站seo推广公司靠谱吗
  • 建站快车用户登录企业自建网站
  • 秦皇岛网站设计公司爱站网长尾关键词搜索
  • wordpress主题uehtml班级优化大师官网登录
  • 动态网站开发网络课程设计做网站的平台有哪些
  • 网络优化大师手机版怎么进行seo
  • 网站三网合一萧山市seo关键词排名
  • 接单网app下载免费手机优化大师下载安装
  • 西安高端网站制作公司网络舆情处置的五个步骤
  • 做封面图的网站sem电子扫描显微镜
  • 如何通过axure做网站品牌营销是什么
  • 箱包东莞网站建设武汉大学人民医院怎么样
  • 建设公司属于什么企业上海网站排名优化
  • 杭州建设银行网站首页今日热点新闻一览
  • dede网站开发步骤网上推广app