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

成都网站建设开发公司长春有哪些互联网大厂

成都网站建设开发公司,长春有哪些互联网大厂,传奇类的网页游戏哪个好玩,郑州优化网站前文#xff1a;Socket套接字编程 TCP的特点 面向连接#xff1a;TCP 在发送数据之前#xff0c;必须先建立连接。可靠性#xff1a;TCP 提供了数据传输的可靠性。面向字节流#xff1a;TCP 是一个面向字节流的协议#xff0c;这意味着 TCP 将应用程序交下来的数据看成是… 前文Socket套接字编程 TCP的特点 面向连接TCP 在发送数据之前必须先建立连接。可靠性TCP 提供了数据传输的可靠性。面向字节流TCP 是一个面向字节流的协议这意味着 TCP 将应用程序交下来的数据看成是一连串的无结构的字节流。 TcpServer.hpp 创建一个Tcp服务端 代码 #pragma once#includeiostream #includestring #includesys/types.h #includesys/socket.h #includenetinet/in.h #includecstring #includearpa/inet.h #includeunistd.h #include sys/wait.h #includefunctional #includepthread.h #includeInetAddr.hpp #includeLog.hpp #includeThreadpool.hppenum {SOCKET_ERROR 1,BIND_ERROR,LISTEN_ERROR,USAGE_ERROR };const static int defaultsockfd -1;//默认文件描述符 const static int gbacklog 16;//默认最大连接数using task_tstd::functionvoid*(); //任务函数的类型V3 class TcpServer; //线程类型数据 class ThreadData { public:ThreadData(int fd,InetAddr addr,TcpServer* s):sockfd(fd),clientaddr(addr),self(s){} public:int sockfd;//文件描述符InetAddr clientaddr;//客户端地址TcpServer* self;//服务端 }; class TcpServer { public:TcpServer(int port):_port(port),_listensock(defaultsockfd),_isrunning(false){}void InitServer(){//1.创建字节流套接字_listensocksocket(AF_INET,SOCK_STREAM,0);if(_listensock0){LOG(FATAL, socket error);exit(SOCKET_ERROR);}LOG(DEBUG, socket create success, sockfd is : %d\n, _listensock);//2.bindstruct sockaddr_in local;memset(local,0,sizeof(local));local.sin_familyAF_INET;local.sin_porthtons(_port);local.sin_addr.s_addrINADDR_ANY;int n ::bind(_listensock,(struct sockaddr*)local,sizeof(local));if(n0){LOG(FATAL, bind error\n);exit(BIND_ERROR);}LOG(DEBUG, bind success, sockfd is : %d\n, _listensock);//3.监听客户端等待被连接nlisten(_listensock,gbacklog);if(n0){LOG(FATAL, listen error);exit(LISTEN_ERROR);}LOG(DEBUG, listen success, sockfd is : %d\n, _listensock);}//将接收到的数据进行处理完成对应服务void Service(int sockfd,InetAddr client){LOG(DEBUG, get a new link, info %s %d ,fd: %d \n ,client.Ip().c_str(),client.Port(),sockfd);std::string clientaddr [ client.Ip() : std::to_string(client.Port()) ]# ;while(true){char inbuffer[1024];ssize_t n read(sockfd,inbuffer,sizeof(inbuffer)-1);//读取数据if(n0){inbuffer[n]0;std::coutclientaddrinbufferstd::endl;//打印对应的数据std::string echo_string [server echo]# ;echo_stringinbuffer;write(sockfd,echo_string.c_str(),echo_string.size());//返回给客户端}else if(n0) //client退出并且关闭连接了{LOG(INFO, %s quit\n, clientaddr.c_str());break;}else{LOG(ERROR, read error\n);break;}}close(sockfd); }//线程的处理函数static void* HandlerSock(void* args){pthread_detach(pthread_self());//线程分离ThreadData* tdstatic_castThreadData*(args);//创建对应线程数据类型td-self-Service(td-sockfd,td-clientaddr);delete td;return nullptr;}//服务器循环运行着void Loop(){_isrunningtrue;while(_isrunning){struct sockaddr_in peer;//sock地址peersocklen_t lensizeof(peer);//要先通过连接才能够进行通信int sockfd::accept(_listensock,(struct sockaddr *)peer,len);//这里的监听sock和sockfd是不同的if(sockfd0){LOG(WARNING, accept error\n);continue;}//Version0 这种版本只能接收一次需求无法多客户端连接// Service(sockfd,InetAddr(peer));//Version1 多进程// pid_t idfork();// if(id0)// {// //子进程负责连接父进程负责监听// close(_listensock);// if(fork()0) exit(0);// //孙进程负责服务由于子进程连接之后子进程会进行回收因此孙进程称为孤儿进程之后不受子进程的影响// //类似线程分离是独立的之后受系统进行回收// Service(sockfd,InetAddr(peer));// exit(0);// }// //父进程只负责监听不需要进行连接// close(sockfd);// waitpid(id,nullptr,0);//Version2:采用多线程pthread_t t;ThreadData* tdnew ThreadData(sockfd,peer,this);pthread_create(t,nullptr,HandlerSock,td);//将线程分离//Version3:线程池//task_t t std::bind(TcpServer::Service,this,sockfd,InetAddr(peer));//ThreadPooltask_t::GetInstance()-Enqueue(t);}_isrunningfalse;}~TcpServer(){if(_listensockdefaultsockfd){close(_listensock);}}private:uint16_t _port;//端口号int _listensock;//监听的文件描述符bool _isrunning;//启动 }; 解释 初始化服务端主要完成套接字的创建绑定已经完成对应的监听客户端因为Tcp是有连接的所以需要监听客户端是否有请求连接的需求 SOCK_STREAM表示字节流 gbacklog这个参数定义了内核应该为相应套接字排队的最大连接数。这个值至少为0其实际值由系统限制可以通过sysctl命令的net.core.somaxconn参数查看和设置。需要注意的是这个值并不是指系统能处理的并发连接数而是内核中等待accept(处理的连接队列的最大长度。 启动服务器之后通过循环让服务端不断运行着在循环里面服务端可能接收到多个客户端请求的连接所以accpet要在循环中不断接收看是否有对应的连接 连接完之后通过Service服务函数完成双方的通信 在Loop中循环表示接收多个客户端而Service中循环表示每个服务端与客户端的通信保持 由于tcp是面向字节流的所以可以利用文件描述符的性质运用read函数读取对应的发送端数据. 当n大于0时表示对方有数据发送处理完信息后反馈给对方 当n0表示sockfd被关闭了也就是连接被断开了 当n小于0时表示出现错误 如果一直没有发送数据那么会在read函数这里发生阻塞 而对于服务的处理这里有多种方法如果直接使用Service函数的话是不可行的因为这样无法多客户端连接 通过多进程的方法让父进程只负责监听子进程负责连接孙进程负责服务由于孙进程是孤儿进程相当于线程分离这样处理服务时就不会受到父子进程的影响了也就能完成多客户端的通信了 直接通过多线程的方法将创建的线程进行分离完成对应的服务任务 main.cc #includeTcpServer.hpp #includememoryvoid Usage(std::string proc) {std::cout Usage:\n\t proc local_port\n std::endl; } // ./main.cc 8080 int main(int argc,char* argv[]) {if(argc!2){Usage(argv[0]);return 1;}EnableScreen();//打印到屏幕uint16_t portstd::stoi(argv[1]);//获取端口号std::unique_ptrTcpServer tsvrstd::make_uniqueTcpServer(port);//服务端的指针tsvr-InitServer();//初始化tsvr-Loop();//循环运行return 0;}TcpClient.cc #includeiostream #includestring #includesys/types.h #includesys/socket.h #includearpa/inet.h #includenetinet/in.h #includeunistd.h #includecstringvoid Usage(std::string proc) {std::cout Usage:\n\t proc serverip serverport\n std::endl; } // ./TcpClient.cc 127.0.0.1 8080 int main(int argc,char* argv[]) {if(argc!3){Usage(argv[0]);exit(1);}std::string serveripargv[1];//服务端ipuint16_t serverportstd::stoi(argv[2]);//服务端端口号int sockfd socket(AF_INET, SOCK_STREAM, 0);//创建套接字if (sockfd 0){std::cerr socket error std::endl;exit(2);}struct sockaddr_in server;memset(server,0,sizeof(server));server.sin_familyAF_INET;server.sin_porthtons(serverport);server.sin_addr.s_addrinet_addr(serverip.c_str());//连接服务端int nconnect(sockfd,(struct sockaddr*)server,sizeof(server));if(n0){std::cerr connect error std::endl;exit(3);}while(true){std::coutPlease Enter# ;std::string outstring;getline(std::cin,outstring);//发送对应数据ssize_t ssend(sockfd,outstring.c_str(),outstring.size(),0);if(s0){char inbuffer[1024];ssize_t mrecv(sockfd,inbuffer,sizeof(inbuffer)-1,0);//接收对应数据if(m0){inbuffer[m]0;std::coutinbufferstd::endl;}else{break;}}else{break;}}close(sockfd);return 0; }结果
http://www.dnsts.com.cn/news/201202.html

相关文章:

  • 东莞网站建设纸品包装网站建设 论文
  • 郑州网站建设制作公司如何恢复wordpress主题初始内容
  • 内容电商的网站如何做金属加工网站建设
  • 西红门网站建设公司网站访问慢的原因
  • 网站建设怎么外包好营销软文的范文
  • 免费网站制作模板中英企业网站模板
  • 5000做网站无障碍网站建设的意义
  • 范县网站建设费用郑州市做网站公司a汉狮
  • e网站建设园艺建设网站
  • 网站框架设计wordpress菜单颜色
  • 海南论坛网站建设息壤空间怎么上传网站
  • 网站宽屏背景汕头建设
  • 营销类型的公司网站站长统计app软件
  • 石家庄最好的网站建设公司网站开展营销的思路和方法
  • 苏州美丽乡村建设网站电子商务公司网站怎么建
  • 医疗网站建设资讯用DW做的网站生成链接
  • 网站跳出率多少合适网站建设怎么分析市场分析
  • 中国造价工程建设监理协会网站学院网站建设项目
  • 如何建立一个网站并运行类似于小红书的江苏商城网站建设
  • 建电子商务网站多少钱wordpress安装乱码
  • 微教育云平台网站建设代发网站建设
  • 做360手机网站快速排名软件做网站需要多大空间
  • 建设商城类网站多少钱一个服务器可以备案几个网站吗
  • 个人网站首页设计欣赏中小企业网站建设价位
  • 网站二级页面怎么做公司企业简介图片
  • 简单易做的的网站网站建设好不好学
  • 网站推广app软件下载有什么网站是专做婚礼素材的
  • 如何快速推广一个网站青岛seo精灵
  • 优惠券网站怎么做腾讯云注册域名dnspod
  • 商城WordPress东莞seoseo关键词排名优化