怎么樣創(chuàng)建一個(gè)網(wǎng)站明星百度指數(shù)在線(xiàn)查詢(xún)
C++ 網(wǎng)絡(luò)編程 asio 使用總結(jié) - 知乎 (zhihu.com)
基于Boost::asio的多線(xiàn)程異步TCP服務(wù)器,實(shí)現(xiàn)了io_service線(xiàn)程池,測(cè)試了1萬(wàn)左右的并發(fā)訪(fǎng)問(wèn),讀寫(xiě)無(wú)壓力_boost asio支持最大并發(fā)_E404的博客-CSDN博客
?單線(xiàn)程
?server.cpp
#include <cstdlib>
#include <ctime>#include <iostream>
#include <memory>
#include <utility>
#include <string>#include <boost/asio.hpp>using boost::asio::ip::tcp;class session : public std::enable_shared_from_this <session> //從enable_shared_from_this繼承的類(lèi)需要使用智能指針管理資源
{public:session(tcp::socket socket) : socket_(std::move(socket)) { } void start(){do_read(); }private:void do_read(){auto self(shared_from_this()); //對(duì)自己的引用計(jì)數(shù)+1socket_.async_read_some(boost::asio::buffer(data_,max_length),[this,self](boost::system::error_code ec , std::size_t length){printf("recv data:%s\n",data_);if(!ec){ do_write(length);}});}void do_write(std::size_t length){auto self(shared_from_this());boost::asio::async_write(socket_,boost::asio::buffer(data_,length),[this,self](boost::system::error_code ec , std::size_t){if(!ec){do_read(); }});}private:tcp::socket socket_;enum {max_length = 1024};char data_[max_length];
};class Server
{public:Server(boost::asio::io_service &io_service,short port) : acceptor_(io_service, tcp::endpoint(tcp::v4(),port)) , socket_(io_service) { }void start(){do_accept();}private:void do_accept(){acceptor_.async_accept(socket_ , [this](boost::system::error_code ec) //創(chuàng)建一個(gè)socket連接{if(!ec){auto newSession = std::make_shared<session>(std::move(socket_));newSession->start();} do_accept();});}tcp::acceptor acceptor_;tcp::socket socket_;
};int main(int argc,char *argv[])
{try{if(argc != 2){std::cerr << "請(qǐng)輸入端口號(hào):" << std::endl;return 1;}boost::asio::io_service io_service;Server s(io_service,std::atoi(argv[1]));s.start();io_service.run();}catch(std::exception &e){std::cerr << "異常:" << e.what() << std::endl;}return 0;
}
client.cpp
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <signal.h>
#include <arpa/inet.h>#define MAXSIZE 1024
#define IP_ADDR "127.0.0.1"
#define IP_PORT 8888int i_sockfd = -1;void SigCatch(int sigNum) //信號(hào)捕捉函數(shù)(捕獲Ctrl+C)
{if(i_sockfd != -1){close(i_sockfd);}printf("Bye~! Will Exit...\n");exit(0);
}int main()
{struct sockaddr_in st_clnsock;char msg[1024];int nrecvSize = 0;signal(SIGINT, SigCatch); //注冊(cè)信號(hào)捕獲函數(shù)if((i_sockfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0) //建立套接字{printf("socket Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}memset(&st_clnsock, 0, sizeof(st_clnsock));st_clnsock.sin_family = AF_INET; //IPv4協(xié)議//IP地址轉(zhuǎn)換(直接可以從物理字節(jié)序的點(diǎn)分十進(jìn)制 轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序)if(inet_pton(AF_INET, IP_ADDR, &st_clnsock.sin_addr) <= 0){printf("inet_pton Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}st_clnsock.sin_port = htons(IP_PORT); //端口轉(zhuǎn)換(物理字節(jié)序到網(wǎng)絡(luò)字節(jié)序)if(connect(i_sockfd, (struct sockaddr*)&st_clnsock, sizeof(st_clnsock)) < 0) //主動(dòng)向設(shè)置的IP和端口號(hào)的服務(wù)端發(fā)出連接{printf("connect Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}printf("======connect to server, sent data======\n");while(1) //循環(huán)輸入,向服務(wù)端發(fā)送數(shù)據(jù)并接受服務(wù)端返回的數(shù)據(jù){fgets(msg, MAXSIZE, stdin);printf("will send: %s", msg);if(write(i_sockfd, msg, MAXSIZE) < 0) //發(fā)送數(shù)據(jù){printf("write Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}memset(msg, 0, sizeof(msg));if((nrecvSize = read(i_sockfd, msg, MAXSIZE)) < 0) //接受數(shù)據(jù){printf("read Error: %s (errno: %d)\n", strerror(errno), errno);}else if(nrecvSize == 0){printf("Service Close!\n");}else{printf("Server return: %s\n", msg);}}return 0;
}