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

绍兴公司网站建设 中企动力绍兴sem是什么职业岗位

绍兴公司网站建设 中企动力绍兴,sem是什么职业岗位,园林景观设计公司质量环境职业健康安全管控,电脑做网站空间文章目录 前言一. 服务器1. 初始化服务器2. 启动服务器 二. 客户端三. 多进程服务器结束语 前言 本系列文章是计算机网络学习的笔记#xff0c;欢迎大佬们阅读#xff0c;纠错#xff0c;分享相关知识。希望可以与你共同进步。 本篇博客基于UDP socket基础#xff0c;介绍… 文章目录 前言一. 服务器1. 初始化服务器2. 启动服务器 二. 客户端三. 多进程服务器结束语 前言 本系列文章是计算机网络学习的笔记欢迎大佬们阅读纠错分享相关知识。希望可以与你共同进步。 本篇博客基于UDP socket基础介绍TCP socket编程接口和细节 UDP socket编程可参看【计算机网络学习之路】UDP socket编程 本次编写的服务器和客户端依然是最简单的echo服务器 一. 服务器 服务器的基本框架 tcp_server.hpp #pragma once#include iostream #include string #include cstring #include cerrno #include unistd.h #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.hnamespace ns_server {const uint16_t default_port 8888;class TcpServer{public:TcpServer(uint16_t port default_port) : _port(port){}void InitServer(){}//初始化服务器void Start(){}//启动服务器~TcpServer(){}private:int _sock; // 监听套接字uint16_t _port; // 端口号}; }tcp_server.cc #includetcp_server.hpp #includememoryusing namespace std; using namespace ns_server;static void usage(char*argv) {coutUsage\n\targv serverPortendl; } int main(int argc,char*argv[]) {if(argc!2){usage(argv[0]);exit(USAGE_ERR);}uint16_t portatoi(argv[1]);unique_ptrTcpServer usvr(new TcpServer(echo,port));usvr-InitServer();usvr-Start();return 0; }1. 初始化服务器 服务器的初始化还是一样的 创建套接字绑定套接字 void InitServer() {// 1.创建套接字_sock socket(AF_INET, SOCK_STREAM, 0);if (_listensock 0){std::cerr create sock error, strerror(errno) std::endl;exit(1);}std::cout create listensock success: _sock std::endl;// 2.绑定套接字struct sockaddr_in local;local.sin_family AF_INET;local.sin_port htons(_port);local.sin_addr.s_addr INADDR_ANY;if (bind(_sock , (struct sockaddr *)local, sizeof(local)) 0){std::cerr bind error, strerror(errno) std::endl;exit(2);} }需要注意的是socket的第二个参数为SOCK_STREAM面向字节流 TCP与UDP不同的地方是TCP是面向连接的UDP是无连接的 所以TCP还需要listen 返回值成功返回0失败返回-1并设置错误码 backlog参数需要在后续TCP详解中学习先定义大小为32 const int backlog 32; void InitServer() {// 1.创建套接字_sock socket(AF_INET, SOCK_STREAM, 0);if (_listensock 0){std::cerr create sock error, strerror(errno) std::endl;exit(1);}std::cout create listensock success: _sock std::endl;// 2.绑定套接字struct sockaddr_in local;local.sin_family AF_INET;local.sin_port htons(_port);local.sin_addr.s_addr INADDR_ANY;if (bind(_sock , (struct sockaddr *)local, sizeof(local)) 0){std::cerr bind error, strerror(errno) std::endl;exit(2);}// 3.监听if (listen(_listensock, backlog) 0){std::cerr listen error, strerror(errno) std::endl;exit(3);} }初始化到此就结束了 接下来是启动服务器 2. 启动服务器 TCP通过accept获取客户端连接 sockfdsocket返回的文件描述符addr输入输出型参数客户端信息的结构体addrlen输入输出型参数结构体大小。注意需要传入addr的大小返回值是网络文件描述符 在TCP中socket返回的网络文件可以理解为连接文件内部保存了连接信息 而accept是从连接文件中获取连接然后创建套接字网络文件。 真正通信的是connect创建的网络文件 我们将私有成员的_sock改为_listensock void Start() {while (true){struct sockaddr_in client;memset(client, 0, sizeof(client));socklen_t len sizeof(client);int sock accept(_listensock, (struct sockaddr *)client, len);if (sock 0){std::cerr accept error std::endl;continue;}// 提取客户端信息std::string clientIp inet_ntoa(client.sin_addr);uint16_t clientPort ntohs(client.sin_port);std::string name [ clientIp : std::to_string(clientPort) ];std::cout create sock sock from _listensock std::endl;} }接下来就可以在connect返回的套接字中读写数据了。 本次使用read和write void Start() {while (true){struct sockaddr_in client;memset(client, 0, sizeof(client));socklen_t len sizeof(client);int sock accept(_listensock, (struct sockaddr *)client, len);if (sock 0){std::cerr accept error std::endl;continue;}// 提取客户端信息std::string clientIp inet_ntoa(client.sin_addr);uint16_t clientPort ntohs(client.sin_port);std::string name [ clientIp : std::to_string(clientPort) ];std::cout create sock sock from _listensock std::endl;char buffer[1024];while (true){int n read(sock, buffer, sizeof(buffer) - 1);if (n 0){buffer[n] \0;std::cout name # buffer std::endl;std::string responce buffer;//返回收到的数据int m write(sock, responce.c_str(), responce.size());}else if (n 0){// 写端关闭std::cout name quit,me to std::endl;close(sock);break;}else{// 读数据异常std::cerr read error std::endl;break;}}} }完整代码 tcp_server.hpp #pragma once#include iostream #include string #include cstring #include cerrno #include unistd.h #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.hnamespace ns_server {const uint16_t default_port 8888;const int backlog 32;class TcpServer{public:TcpServer(func_t func, uint16_t port default_port) : _port(port), _func(func){}void InitServer(){// 1.创建套接字_listensock socket(AF_INET, SOCK_STREAM, 0);if (_listensock 0){std::cerr create sock error, strerror(errno) std::endl;exit(1);}std::cout create listensock success: _listensock std::endl;// 2.绑定套接字struct sockaddr_in local;local.sin_family AF_INET;local.sin_port htons(_port);local.sin_addr.s_addr INADDR_ANY;if (bind(_listensock, (struct sockaddr *)local, sizeof(local)) 0){std::cerr bind error, strerror(errno) std::endl;exit(2);}// 3.监听if (listen(_listensock, backlog) 0){std::cerr listen error, strerror(errno) std::endl;exit(3);}}void Start(){while (true){struct sockaddr_in client;memset(client, 0, sizeof(client));socklen_t len sizeof(client);int sock accept(_listensock, (struct sockaddr *)client, len);if (sock 0){std::cerr accept error std::endl;continue;}// 提取客户端信息std::string clientIp inet_ntoa(client.sin_addr);uint16_t clientPort ntohs(client.sin_port);std::string name [ clientIp : std::to_string(clientPort) ];std::cout create sock sock from _listensock std::endl;char buffer[1024];while (true){int n read(sock, buffer, sizeof(buffer) - 1);if (n 0){buffer[n] \0;std::cout name # buffer std::endl;std::string responce buffer;int m write(sock, responce.c_str(), responce.size());}else if (n 0){// 写端关闭std::cout name quit,me to std::endl;close(sock);break;}else{// 读数据异常std::cerr read error std::endl;break;}}}}~TcpServer(){}private:int _listensock; // 监听套接字uint16_t _port; // 端口号}; }PS上述的服务器是单进程所以只能同时处理一个客户端读者可以尝试添加一下多进程多线程或者线程池 本篇博客最后会贴出多进程的方案 二. 客户端 客户端就不作封装了 最开始也是要创建套接字 然后TCP的客户端需要connect服务器 sockfdsocket返回的文件描述符addr服务器信息的结构体addrlen结构体大小。返回值成功返回0失败返回-1并设置错误码 注意connect时OS会bind客户端 UDP是在发送数据时才会bind #include iostream #include string #include unistd.h #include cstring #include cerrno #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.husing namespace std;static void usage(char *argv) {cout Usage:\n\t argv serverIp serverPort endl; }int main(int argc, char *argv[]) {if (argc ! 3){usage(argv[0]);exit(USAGE_ERR);}string serverIp argv[1];uint16_t serverPort atoi(argv[2]);// 1.创建套接字int sock socket(AF_INET, SOCK_STREAM, 0);if (sock 0){cerr create sock error, strerror(errno) endl;exit(SOCKET_ERR);}coutcreate sock sucess:sockendl;// 2. 连接struct sockaddr_in server;memset(server, 0, sizeof(server));server.sin_family AF_INET;server.sin_addr.s_addr inet_addr(serverIp.c_str());server.sin_port htons(serverPort);int cnt 5; // 记录重连次数// connect时会bindwhile (connect(sock, (struct sockaddr *)server, sizeof(server)) 0){cout 正在重连...还有 cnt-- 次 endl;if (cnt 0){ cerr连接失败endl;exit(CONNECT_ERR);}sleep(1);}// 连接成功string name [serverIp : to_string(serverPort)];cout connect name sucess endl;return 0; }然后也可以开始读写数据了 完整代码 tcp_client.cc #include iostream #include string #include unistd.h #include cstring #include cerrno #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.husing namespace std;static void usage(char *argv) {cout Usage:\n\t argv serverIp serverPort endl; }int main(int argc, char *argv[]) {if (argc ! 3){usage(argv[0]);exit(USAGE_ERR);}string serverIp argv[1];uint16_t serverPort atoi(argv[2]);// 1.创建套接字int sock socket(AF_INET, SOCK_STREAM, 0);if (sock 0){cerr create sock error, strerror(errno) endl;exit(SOCKET_ERR);}coutcreate sock sucess:sockendl;// 2. 连接struct sockaddr_in server;memset(server, 0, sizeof(server));server.sin_family AF_INET;server.sin_addr.s_addr inet_addr(serverIp.c_str());server.sin_port htons(serverPort);int cnt 5; // 记录重连次数// connect时会bindwhile (connect(sock, (struct sockaddr *)server, sizeof(server)) 0){cout 正在重连...还有 cnt-- 次 endl;if (cnt 0){ cerr连接失败endl;exit(CONNECT_ERR);}sleep(1);}// 连接成功string name [serverIp : to_string(serverPort)];cout connect name sucess endl;// 发送消息while (true){cout please enter your message# ;string message;getline(cin, message);int n write(sock, message.c_str(), message.size());if (n 0){cerr write error, strerror(errno) endl;break;}else if (n 0){cout 读端关闭停止写 endl;break;}char buffer[1024];int m read(sock, buffer, sizeof(buffer) - 1);if (m 0){buffer[n] \0;coutname echo bufferendl;}else if (m 0){// 写端关闭std::cout name quit,me to std::endl;close(sock);break;}else{// 读数据异常std::cerr read error std::endl;break;}}return 0; }三. 多进程服务器 tcp_server.hpp #pragma once#include iostream #include string #include cstring #include cerrno #include unistd.h #include signal.h #include sys/wait.h #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.hnamespace ns_server {const uint16_t default_port 8888;const int backlog 32;class TcpServer{public:TcpServer(uint16_t port default_port) : _port(port){}void InitServer(){// 1.创建套接字_listensock socket(AF_INET, SOCK_STREAM, 0);if (_listensock 0){std::cerr create sock error, strerror(errno) std::endl;exit(1);}std::cout create listensock success: _listensock std::endl;// 2.绑定套接字struct sockaddr_in local;local.sin_family AF_INET;local.sin_port htons(_port);local.sin_addr.s_addr INADDR_ANY;if (bind(_listensock, (struct sockaddr *)local, sizeof(local)) 0){std::cerr bind error, strerror(errno) std::endl;exit(2);}// 3.监听if (listen(_listensock, backlog) 0){std::cerr listen error, strerror(errno) std::endl;exit(3);}}void Start(){//忽略子进程的信号不需要等待子进程退出推荐signal(SIGCHLD,SIG_IGN);while (true){struct sockaddr_in client;memset(client, 0, sizeof(client));socklen_t len sizeof(client);int sock accept(_listensock, (struct sockaddr *)client, len);if (sock 0){std::cerr accept error std::endl;continue;}std::cout create sock sock from _listensock std::endl;// 多进程pid_t id fork();if (id 0){close(sock);continue;}else if (id 0){//子进程close(_listensock);//建议关掉不需要的fdif(fork()0)exit(0);//子进程退掉后续为孙子进程// 提取客户端信息std::string clientIp inet_ntoa(client.sin_addr);uint16_t clientPort ntohs(client.sin_port);service(sock, clientIp, clientPort);exit(0);}//父进程//一定关掉不需要的fd防止fd泄露close(sock);//pid_t retwaitpid(id,nullptr,0);//默认为阻塞等待//pid_t retwaitpid(id,nullptr,WNOHANG);//非阻塞//if(retid) std::coutwait id sucessstd::endl;}}void service(int sock, std::string clientIp, uint16_tclientPort){std::string name [ clientIp : std::to_string(clientPort) ];char buffer[1024];while (true){int n read(sock, buffer, sizeof(buffer) - 1);if (n 0){buffer[n] \0;std::cout name # buffer std::endl;std::string responce buffer;int m write(sock, responce.c_str(), responce.size());}else if (n 0){// 写端关闭std::cout name quit,me to std::endl;close(sock);break;}else{// 读数据异常std::cerr read error std::endl;break;}}}~TcpServer(){}private:int _listensock; // 监听套接字uint16_t _port; // 端口号}; }结束语 本篇博客到此结束感谢看到此处。 欢迎大家纠错和补充 如果觉得本篇文章对你有所帮助的话不妨点个赞支持一下博主拜托啦这对我真的很重要。
http://wiki.neutronadmin.com/news/147815/

相关文章:

  • 网站建设企网站建设背景分析
  • 常州建设网站代理商网站做直播需要什么资质
  • 开封网站开发财经网站源码 织梦
  • 深圳网站建设模板乐云seo虎丘做网站价格
  • 济南网站开发公司排名个人手机网站大全
  • 中职电子商务网站建设与维护考试题自己做的网址如何推广
  • 农村学校资源网站建设与研究广告营销策划公司
  • 网站怎么做身份验证哪里建设网站比较好
  • 鞍山外国网站制作网站开发 软件开发
  • 网站做优化有什么好处wordpress用户登陆
  • wordpress爱视频优化方案英语必修二电子版
  • 网站建设开发熊掌号阿里巴巴电子商务网站建设目的
  • 唐山网站制作方案线上网站开发系统流程图
  • 网站优化个人工作室帮人管理网站做淘宝客
  • p2p网站开发方法南京app外包
  • 北京建设管理有限公司官网seo关键词排名优
  • 自然堂官方网站建设北京做网站那家好
  • 零食网站色调搭配怎麽做北京怎样做网站推广
  • 上海跨境电商网站制作佛山网站优化推广方案
  • 永康网站开发公司公司网站推广技巧
  • 宝塔怎么创建网站手机网站推荐几个
  • 一级域名免费网站怎么申请成都网站推广营销设计
  • 企业门户网站静态模板wordpress设计
  • 齐齐哈尔企业网站排名优化wordpress忘记账号密码
  • 自媒体平台网站开发杭州电子商务网站建设公司
  • 苏州市优化网站推广哪家好游戏网站风控怎么做
  • 如何快速模仿一个网站怎么删除一个wordpress
  • 惠州建设局网站泉做网站的公司
  • 一般建站需要多少钱wordpress积分
  • 创建网站公司 徐州岳塘区建设路街道网站