boost 编写finger服务
本篇是模仿PYTHON TWISTED写一个FINGER示例。
从最简单的链接到通过接收字符串返回不同的内容
1 最简单的链接
#include <ctime>
#include <iostream>
#include <string>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp> using boost::asio::ip::tcp; int main()
{
try{
boost::asio::io_service io_service;
io_service.run();
}
catch (std::exception& e) {
std::cerr << e.what() << std::endl;
} std::cout << "finished!" << std::endl;
return ;
}
运行显示如下
finished!
请按任意键继续. . .
2 接收ACCEPT请求 然后丢弃
#include <ctime>
#include <iostream>
#include <string>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp> using boost::asio::ip::tcp; static USHORT defaultPort = ; class tcp_server {
public:
tcp_server(boost::asio::io_service& io_service) :
io_service_(io_service),
acceptor_(io_service, tcp::endpoint(tcp::v4(), defaultPort)) {
start_accept();
}
private:
void start_accept() {
boost::shared_ptr<tcp::socket> new_connection(new tcp::socket(io_service_)); acceptor_.async_accept(*new_connection,boost::bind(&tcp_server::handle_accept,this,
new_connection,boost::asio::placeholders::error));
} void handle_accept(boost::shared_ptr<tcp::socket> new_connection,
const boost::system::error_code error) {
if (!error) {
std::cout << "recv a connection!" << std::endl;
new_connection->shutdown(boost::asio::socket_base::shutdown_type::shutdown_both);
}
start_accept();
} boost::asio::io_service& io_service_;
tcp::acceptor acceptor_;
}; int main()
{
try {
boost::asio::io_service io_service;
tcp_server server(io_service);
io_service.run();
}
catch (std::exception& e) {
std::cerr << e.what() << std::endl;
} std::cout << "finished!" << std::endl;
return ;
}
运行显示如下:
recv a connection!
客户端运行 显示
telnet 127.0.0.1 1123
3 接收连接发送过来的内容 显示 然后关闭
#include <ctime>
#include <iostream>
#include <string>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp> using boost::asio::ip::tcp; static USHORT defaultPort = ; class tcp_connection :public boost::enable_shared_from_this<tcp_connection>
{
public:
typedef boost::shared_ptr<tcp_connection> pointer;
static pointer create(boost::asio::io_service& io_service) {
return pointer(new tcp_connection(io_service));
} tcp::socket& socket() {
return socket_;
} void start() {
boost::asio::async_read_until(socket_, input_buffer_, '\n',
boost::bind(&tcp_connection::handle_read, shared_from_this(), _1));
}
private:
void handle_read(const boost::system::error_code& err) {
if (!err) {
std::string line;
std::istream is(&input_buffer_);
std::getline(is,line);
if (!line.empty())
{
std::cout << "Received: " << line << "\n";
}
socket_.shutdown(boost::asio::socket_base::shutdown_both);
}
} tcp_connection(boost::asio::io_service& io_service)
:socket_(io_service) {} boost::asio::streambuf input_buffer_;
tcp::socket socket_;
std::string message_;
}; class tcp_server {
public:
tcp_server(boost::asio::io_service& io_service) :
io_service_(io_service),
acceptor_(io_service, tcp::endpoint(tcp::v4(), defaultPort)) {
start_accept();
}
private:
void start_accept() {
tcp_connection::pointer new_connection =
tcp_connection::create(acceptor_.get_io_service()); acceptor_.async_accept(new_connection->socket(),
boost::bind(&tcp_server::handle_accept, this, new_connection,
boost::asio::placeholders::error));
std::cout << "new a connection" << std::endl;
} void handle_accept(tcp_connection::pointer new_connection,
const boost::system::error_code& error) {
if (!error) {
new_connection->start();
}
start_accept();
} boost::asio::io_service& io_service_;
tcp::acceptor acceptor_;
}; int main()
{
try {
boost::asio::io_service io_service;
tcp_server server(io_service);
io_service.run();
}
catch (std::exception& e) {
std::cerr << e.what() << std::endl;
} std::cout << "finished!" << std::endl;
return ;
}
运行并TELNET连接后显示如下
new a connection
new a connection
Received: sadasd
4 接收连接发送内容 并返回指定内容
#include <ctime>
#include <iostream>
#include <string>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp> using boost::asio::ip::tcp; static USHORT defaultPort = ; class tcp_connection :public boost::enable_shared_from_this<tcp_connection>
{
public:
typedef boost::shared_ptr<tcp_connection> pointer;
static pointer create(boost::asio::io_service& io_service) {
return pointer(new tcp_connection(io_service));
} tcp::socket& socket() {
return socket_;
} void start() {
boost::asio::async_read_until(socket_, input_buffer_, '\n',
boost::bind(&tcp_connection::handle_read, shared_from_this(), _1));
}
private:
void handle_read(const boost::system::error_code& err) {
if (!err) {
std::string line;
std::istream is(&input_buffer_);
std::getline(is, line);
if (!line.empty())
{
std::cout << line << "\n";
}
boost::asio::async_write(socket_,
boost::asio::buffer("no this user", strlen("no this user")+),
boost::bind(&tcp_connection::handle_write, shared_from_this(),
boost::asio::placeholders::error)); }
} void handle_write(const boost::system::error_code& error) {
if (!error) {
socket_.shutdown(boost::asio::socket_base::shutdown_both);
}
} tcp_connection(boost::asio::io_service& io_service)
:socket_(io_service) {} boost::asio::streambuf input_buffer_;
tcp::socket socket_;
std::string message_;
}; class tcp_server {
public:
tcp_server(boost::asio::io_service& io_service) :
io_service_(io_service),
acceptor_(io_service, tcp::endpoint(tcp::v4(), defaultPort)) {
start_accept();
}
private:
void start_accept() {
tcp_connection::pointer new_connection =
tcp_connection::create(acceptor_.get_io_service()); acceptor_.async_accept(new_connection->socket(),
boost::bind(&tcp_server::handle_accept, this, new_connection,
boost::asio::placeholders::error));
std::cout << "new a connection" << std::endl;
} void handle_accept(tcp_connection::pointer new_connection,
const boost::system::error_code& error) {
if (!error) {
new_connection->start();
}
start_accept();
} boost::asio::io_service& io_service_;
tcp::acceptor acceptor_;
}; int main()
{
try {
boost::asio::io_service io_service;
tcp_server server(io_service);
io_service.run();
}
catch (std::exception& e) {
std::cerr << e.what() << std::endl;
} std::cout << "finished!" << std::endl;
return ;
}
运行后显示如下
new a connection
new a connection
asdas
telnet客户端显示
no this user
遗失对主机的连接。
5 接收发送的内容 并在记录中查找是否有该内容的记录
#include <ctime>
#include <iostream>
#include <string>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>
#include <map> using boost::asio::ip::tcp; static USHORT defaultPort = ; typedef std::map<std::string, std::string> UserMap;
UserMap users; class tcp_connection :public boost::enable_shared_from_this<tcp_connection>
{
public:
typedef boost::shared_ptr<tcp_connection> pointer;
static pointer create(boost::asio::io_service& io_service) {
return pointer(new tcp_connection(io_service));
} tcp::socket& socket() {
return socket_;
} void start() {
boost::asio::async_read_until(socket_, input_buffer_, '\n',
boost::bind(&tcp_connection::handle_read, shared_from_this(), _1));
}
private:
void handle_read(const boost::system::error_code& err) {
if (!err) {
std::istream is(&input_buffer_);
is >> line_;
if (!line_.empty())
{
std::cout << line_ << "\n";
UserMap::iterator it = users.find(line_);
if (it != users.end())
{
line_ = it->second;
}
else {
line_ = "no this user";
}
}
else {
line_ = "string error!";
}
boost::asio::async_write(socket_,
boost::asio::buffer(line_, line_.size()),
boost::bind(&tcp_connection::handle_write, shared_from_this(),
boost::asio::placeholders::error)); }
} void handle_write(const boost::system::error_code& error) {
if (!error) {
socket_.shutdown(boost::asio::socket_base::shutdown_both);
}
} tcp_connection(boost::asio::io_service& io_service)
:socket_(io_service) {} std::string line_;
boost::asio::streambuf input_buffer_;
tcp::socket socket_;
std::string message_;
}; class tcp_server {
public:
tcp_server(boost::asio::io_service& io_service) :
io_service_(io_service),
acceptor_(io_service, tcp::endpoint(tcp::v4(), defaultPort)) {
start_accept();
}
private:
void start_accept() {
tcp_connection::pointer new_connection =
tcp_connection::create(acceptor_.get_io_service()); acceptor_.async_accept(new_connection->socket(),
boost::bind(&tcp_server::handle_accept, this, new_connection,
boost::asio::placeholders::error));
std::cout << "new a connection" << std::endl;
} void handle_accept(tcp_connection::pointer new_connection,
const boost::system::error_code& error) {
if (!error) {
new_connection->start();
}
start_accept();
} boost::asio::io_service& io_service_;
tcp::acceptor acceptor_;
}; int main()
{
try {
users["DEF"] = "PASS";
boost::asio::io_service io_service;
tcp_server server(io_service);
io_service.run();
}
catch (std::exception& e) {
std::cerr << e.what() << std::endl;
} std::cout << "finished!" << std::endl;
return ;
}
运行后显示如下
new a connection
new a connection
dda
new a connection
DEF
telnet客户端显示
PASS
遗失对主机的连接。

以上代码所有连接 均以telnet作为客户端
telnet 127.0.0.1 1123
正在连接127.0.0.1...
boost 编写finger服务的更多相关文章
- C#编写window服务,一步一步(1)
Window服务是啥,这里就不废话了,如何用在哪里用也不废话了,这里我这篇文章只是详述了我在vs2012中创建window服务的经过,希望对你有所帮助. 另外:我在编写服务过程中参考了 Profess ...
- C#编写windows服务
项目要求: 数据库用有一张表,存放待下载文件的地址,服务需要轮训表将未下载的文件下载下来. 表结构如下: 过程: VS--文件-->新建项目-->windows-->windows服 ...
- 在python中编写socket服务端模块(二):使用poll或epoll
在linux上编写socket服务端程序一般可以用select.poll.epoll三种方式,本文主要介绍使用poll和epoll编写socket服务端模块. 使用poll方式的服务器端程序代码: i ...
- 编写WCF服务时右击配置文件无“Edit WCF Configuration”(编辑 WCF 配置)远程的解决办法
原文:编写WCF服务时右击配置文件无“Edit WCF Configuration”远程的解决办法 今天在看<WCF揭秘>书中看到作者提出可以在一个WCF Host应用程序的App.Con ...
- 使用C语言编写windows服务一般框架
原文:使用C语言编写windows服务一般框架 编写windows服务和编写windows应用程序一样,有一些回调函数必须填写且向windows 服务管理器(service manager)进行注册, ...
- C#编写WINNT服务
C#编写WINNT服务,随便解决安卓开发遇到的5037被众多程序无节操占用的问题 需求分析: 最近重新开始学习安卓开发,好久不用的ADT集成开发环境频繁遇到不能在仿真机和真机上调试的问题,也就是本人另 ...
- C#编写Windows 服务
C#编写Windows 服务 Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时 ...
- python实现编写windows服务
使用python编写windows服务 最近测试服务器上经常发生磁盘空间不足,每次手动清除比较麻烦,所以写个windows服务定时清理下.中间也遇到过几个坑,一起记录下来. 1.python实现win ...
- 如何在Ruby中编写微服务?
[编者按]本文作者为 Pierpaolo Frasa,文章通过详细的案例,介绍了在Ruby中编写微服务时所需注意的方方面面.系国内 ITOM 管理平台 OneAPM 编译呈现. 最近,大家都认为应当采 ...
随机推荐
- Inheritance setUp() and tearDown() methods from Classsetup() and Classteardown
I have a general test class in my nosetests suit and some sub-classes, inheriting from it. The con ...
- 一键精简Windows不常用的字体.cmd
一键精简Windows不常用的字体.cmd @Echo offset path=%path%;%~dp0setlocal EnableDelayedExpansionset /P dv=请输入要精简W ...
- kafka命令大全
kafka命令大全 http://orchome.com/454
- C++Primer第五版——习题答案详解(八)
习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第9章 顺序容器 练习9.1 a.list,需要按字典序插入,可能插入位置在中间 b.d ...
- weakSelf 和 strongSelf的区别和用处
block会copy要在block中使用的实变量,而copy会是变量的retainCount + 1,如若在不注意很容易造成循环引用.而所谓的循环引用的本质就是,两个对象相互引用,从而造成对象不能正常 ...
- 实验二:Linux下Xen环境的安装
实验名称: Linux下Xen环境的安装(centOS7) 实验环境: 本次实验基本是在centOS7的环境下完成,系统内核和系统版本如下: 实验要求: 为centOS7的环境下安装Xen的平台,能够 ...
- java编程思想(1)--对象导论
对象导论: 1.1 抽象过程 所有的语言都有抽象机制,抽象是解决复杂问题的根本方法.例如:汇编语言是对底层机器的轻微抽象.命令式语言(如:FORTRAN.BASIC.C)又是对汇编语言的抽象. jav ...
- html:class名命名规范
1 前端开发命名规范 1.1 为什么要制定CSS命名规范 统一的命名规范,便于多人开发维护时代码统一,减少项目沟通和交接的成本,增加代码的语义化. 1.2 CSS命名规则 样式类名全部用小写,首字符必 ...
- AOP方法增强自身内部方法调用无效 SpringCache 例子
开启注解@EnableCaChing,配置CacheManager,结合注解@Cacheable,@CacheEvit,@CachePut对数据进行缓存操作 缺点:内部调用,非Public方法上使用注 ...
- 二十一、proxyDesign 代理模式
原理: 时序图: 代码清单: Printable public interface Printable { void setPrinterName(String name); String getPr ...