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

贩卖做网站资料品牌营销平台

贩卖做网站资料,品牌营销平台,宁夏住房和城乡建设厅网站办事窗口,做网站建设还有钱赚吗个人主页~ socket网络编程之TCP 一、TCP实现回显服务器1、服务端(一)TcpServer.hpp(二)main.cpp 2、客户端TcpClient.cpp 二、服务器Start函数1、多进程版2、多线程版 一、TCP实现回显服务器 1、服务端 (一&#xff…

在这里插入图片描述

个人主页~


socket网络编程之TCP

  • 一、TCP实现回显服务器
    • 1、服务端
      • (一)TcpServer.hpp
      • (二)main.cpp
    • 2、客户端
      • TcpClient.cpp
  • 二、服务器Start函数
    • 1、多进程版
    • 2、多线程版

一、TCP实现回显服务器

1、服务端

(一)TcpServer.hpp

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <cstring>
#include <pthread.h>
#include <sys/wait.h>const std::string defaultip = "0.0.0.0";
const int defaultfd = -1;//枚举错误类型
enum
{UsageError = 1,SocketError,BindError,ListenError,
};//封装客户端连接相关信息
class ThreadData
{
public:ThreadData(int fd, const std::string &ip, const uint16_t &p) : sockfd(fd), clientip(ip), clientport(p){}public:int sockfd;std::string clientip;uint16_t clientport;
};class TcpServer
{
public:TcpServer(const uint16_t &port, const std::string &ip = defaultip) : listensock_(defaultfd), port_(port), ip_(ip){}void InitServer(){	//IPv4协议,TCP套接字listensock_ = socket(AF_INET, SOCK_STREAM, 0);if (listensock_ < 0){exit(SocketError);}//local存储本地服务器地址信息并初始化为0struct sockaddr_in local;memset(&local, 0, sizeof(local));//IPv4协议,端口号,IP地址local.sin_family = AF_INET;local.sin_port = htons(port_);inet_aton(ip_.c_str(), &(local.sin_addr));//调用bind将套接字listensock_ 绑定到本地地址localif (bind(listensock_, (struct sockaddr *)&local, sizeof(local)) < 0){exit(BindError);}//将套接字设置为监听状态,最多允许五个客户端连接请求排队等待处理if (listen(listensock_, 5) < 0){exit(ListenError);}}void Start(){while (true){struct sockaddr_in client;socklen_t len = sizeof(client);//新套接字sockfd用于与发起连接请求的客户端进行数据传输//原来的listensock_继续监听int sockfd = accept(listensock_, (struct sockaddr *)&client, &len);if (sockfd < 0){continue;}//将客户端端口号转换为主机字节序uint16_t clientport = ntohs(client.sin_port);//将客户端ip转换为点分十进制字符串char clientip[32];inet_ntop(AF_INET, &(client.sin_addr), clientip, sizeof(clientip));//多进程,从这里开始的下面这段代码,可以用多线程以及线程池替代,在后面说说多线程//这里很巧妙的设计,我们在后边与多线程一起解释pid_t id = fork();if (id == 0){// 子进程关闭监听close(listensock_);//子进程创建“孙子”进程if (fork() > 0)exit(0);Service(sockfd, clientip, clientport); close(sockfd);exit(0);}close(sockfd);// 父进程等待pid_t rid = waitpid(id, nullptr, 0);(void)rid;}}//处理发送来的内容,将数据整合打印到屏幕上void Service(int sockfd, const std::string &clientip, const uint16_t &clientport){char buffer[4096];while (true){ssize_t n = read(sockfd, buffer, sizeof(buffer));if (n > 0){buffer[n] = 0;std::cout << "tcpclient say# " << buffer << std::endl;std::string echo_string = "tcpserver echo# ";echo_string += buffer;write(sockfd, echo_string.c_str(), echo_string.size());}else{break;}}}~TcpServer() {}private:int listensock_;//监听套接字描述符uint16_t port_;//端口号std::string ip_;//ip地址
};

(二)main.cpp

#include "TcpServer.hpp"
#include <iostream>
#include <memory>void Usage(std::string proc)
{std::cout << "\n\rUsage: " << proc << " port[1024+]\n" << std::endl;
}int main(int argc, char *argv[])
{if(argc != 2){Usage(argv[0]);exit(UsageError);}uint16_t port = std::stoi(argv[1]);//智能指针维护服务器std::unique_ptr<TcpServer> tcp_svr(new TcpServer(port));tcp_svr->InitServer();tcp_svr->Start();return 0;
}

2、客户端

TcpClient.cpp

#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>void Usage(const std::string &proc)
{std::cout << "\n\rUsage: " << proc << " serverip serverport\n"<< std::endl;
}int main(int argc, char *argv[])
{if (argc != 3){Usage(argv[0]);exit(1);}std::string serverip = argv[1];uint16_t serverport = std::stoi(argv[2]);//创建TCP套接字描述符int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){std::cerr << "socket error" << std::endl;return 1;}//还是老套路,初始化服务器地址结构体结构体struct sockaddr_in server;memset(&server, 0, sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(serverport);inet_pton(AF_INET, serverip.c_str(), &(server.sin_addr));//连接服务器int n = connect(sockfd, (struct sockaddr*)&server, sizeof(server));if(n < 0){std::cerr << "connet error" << std::endl;return 2;}//循环输出打印std::string message;while (true){std::cout << "Please Enter# ";std::getline(std::cin, message);write(sockfd, message.c_str(), message.size());char inbuffer[4096];n = read(sockfd, inbuffer, sizeof(inbuffer));if (n > 0){inbuffer[n] = 0;std::cout << inbuffer << std::endl;}  }close(sockfd);return 0;
}

在这里插入图片描述

二、服务器Start函数

1、多进程版

//......pid_t id = fork();if (id == 0){// 子进程关闭监听close(listensock_);//子进程创建“孙子”进程if (fork() > 0)exit(0);Service(sockfd, clientip, clientport); close(sockfd);exit(0);}//父进程关闭sockfd描述符close(sockfd);// 父进程等待pid_t rid = waitpid(id, nullptr, 0);(void)rid;
//......

创建子进程后子进程关闭监听描述符,再创建一个“孙子”进程,然后子进程退出,此时孙子进程成为孤儿进程,被系统领养,再进行其他的工作,工作完成后关闭描述符,退出时由系统回收
父进程关闭新创建的描述符,然后父进程进入进程等待,这个进程等待的时间很短甚至没有,因为子进程在创建完“孙子”进程后就退出了,父进程就可以回收掉子进程继续下一轮的循环

整个过程不会担心父进程由于阻塞等待而造成的一系列问题,也不用修改为非阻塞轮询来消耗资源,被领养的孙子进程有系统回收资源,也不用担心它资源泄露
在这里插入图片描述

2、多线程版

//......
//声明
class TcpServer;class ThreadData
{
public:ThreadData(int fd, const std::string &ip, const uint16_t &p, TcpServer *t) : sockfd(fd), clientip(ip), clientport(p), tsvr_(t){}public:int sockfd;				//套接字描述符std::string clientip;	//ip地址uint16_t clientport;	//端口号TcpServer *tsvr_;		//指向TcpServer的指针
};
//......
//TcpServer结构体内static void *Routine(void *args){	//将线程分离,结束后自动释放所占资源pthread_detach(pthread_self());//调用Service函数ThreadData *td = static_cast<ThreadData *>(args);td->tsvr->Service(td->sockfd, td->clientip, td->clientport);delete td;return nullptr;}
//......

一样的效果
在这里插入图片描述


今日分享就到这了~

在这里插入图片描述

http://www.dtcms.com/wzjs/329917.html

相关文章:

  • wordpress 形式修改seo网络推广师招聘
  • 哪有网站给光头强做面正规百度推广
  • 电子商务网页设计与网站建设网络营销手段有哪些方式
  • java开发网站用什么框架新能源汽车公司
  • 九江专业网站建设定制seo1新地址在哪里
  • 莱州人社局网站优化网站seo方案
  • 如何推广一个新平台北京seo网站优化培训
  • 做马甲的网站百度关键词搜索技巧
  • logo图案设计常德seo
  • 小程序游戏搭建百度网站排名优化
  • 淘宝客必须做网站吗腰椎间盘突出压迫神经腿疼怎么治
  • 徐州做网站xlec双11销量数据
  • 潍坊网站建设客服长沙百度推广开户
  • 兰州百度网站建设自己怎么做游戏推广赚钱
  • 在线做图网站制作网页链接
  • 网站建设温州科目一优化排名推广教程网站
  • 用自己电脑做网站服务器-phpstudy+花生壳seo检测优化
  • 个人商城网站建设站长工具星空传媒
  • 汕头关键词优化服务百度seo搜索引擎优化方案
  • 南阳教育论坛网站建设西安关键词seo公司
  • 无锡网站App微信百度网站优化
  • angular 做网站店铺推广方案怎么写
  • 石家庄做网站排名公司网站访问量统计工具
  • 怎么用java做网站中国十大品牌策划公司
  • 菏泽做公司简介网站手机app安装下载
  • 网站怎么做下载网页代码吗关键词英文
  • 做电商网站报价谷歌seo是指什么意思
  • 新疆交通建设管理局官方网站蒙牛牛奶推广软文
  • 新网站怎么做才会被收录北京百度推广客服电话多少
  • 学生如何做网站网站seo方案案例