用asio写网络,简直是种享受啊,贴出来交流交流,代码直接拷到新工程的main.cpp里编译就行了
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <boost/asio.hpp>
using namespace boost::asio;
#include <boost/system/error_code.hpp>
using boost::system::error_code;
#include <boost/bind.hpp>
using boost::bind;
#include <iostream>
using std::cout;
using std::endl;
#include <cstring>
using std::strcmp;
#include <cstdlib>
using std::atoi;
typedef boost::shared_ptr<ip::tcp::socket> socket_sp;
void conn_handler(socket_sp sock, ip::tcp::endpoint ep, const error_code& ec)
{
if (!ec)
{
cout << ep.address().to_string() << ":" << ep.port() << endl;
}
if (ec != error::operation_aborted)
{
sock->close();
}
}
void scan_ip(const char* start, const char* end, unsigned short port)
{
unsigned long s = ntohl(inet_addr(start));
unsigned long e = ntohl(inet_addr(end));
if (s == -1 || e == -1)
{
return;
}
io_service io_service;
boost::thread_group tg;
do
{
io_service::work work(io_service);
tg.create_thread(bind(&io_service::run, &io_service));
for (unsigned long i = s; i <= e; ++i)
{
socket_sp sock(new socket_sp::value_type(io_service));
ip::tcp::endpoint ep(ip::address_v4(i), port);
sock->async_connect(ep, bind(&conn_handler, sock, ep, placeholders::error));
if (i == e) break;
}
} while (false);
tg.join_all();
}
void scan_port(const char* ip, unsigned short start, unsigned short end)
{
unsigned long ip_raw = ntohl(inet_addr(ip));
if (ip_raw == -1)
{
return;
}
io_service io_service;
boost::thread_group tg;
do
{
io_service::work work(io_service);
tg.create_thread(bind(&io_service::run, &io_service));
for (unsigned short i = start; i <= end; ++i)
{
socket_sp sock(new socket_sp::value_type(io_service));
ip::tcp::endpoint ep(ip::address_v4(ip_raw), i);
sock->async_connect(ep, bind(&conn_handler, sock, ep, placeholders::error));
if (i == end) break;
}
} while (false);
tg.join_all();
}
int main(int argc, char* argv[])
{
if (argc == 5)
{
const char* cmd = argv[1];
if (0 == strcmp(cmd, "--ip"))
{
scan_ip(argv[2], argv[3], atoi(argv[4]));
}
else if (0 == strcmp(cmd, "--port"))
{
scan_port(argv[2], atoi(argv[3]), atoi(argv[4]));
}
}
else
{
cout
<< "brought to you by Hater.H (haterh@gmail.com)" << endl
<< "usage:" << endl
<< "scanbot --ip <start_ip> <end_ip> <port>" << endl
<< "scanbot --port <ip> <start_port> <end_port>" << endl;
}
return 0;
}
本文分享了如何利用asio库轻松编写一个端口扫描器。通过简洁的代码示例,展示在C++中进行TCP端口扫描的简单方法。
2752

被折叠的 条评论
为什么被折叠?



