boost asio广播

一篇boost asio UDP广播示例。

为什么要广播

通常我们需要在局域网来进行广播来查找主机,广播的意思就是向同网段的全部主机发送数据包。而在广域网是不允许的,可以想象广域网主机数量之多,广播造成网络堵塞。广播只能是udp,是由路由器向所有主机发送数据包,包括发送者本身。如果发送的是本身,可以留意下你收的IP:192.168.56.1。还有个组播的,这个在广域网和局域网都允许。

示例代码

服务器:

#include <boost/asio.hpp>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <thread>
void handle_send()
{

};
int main()
{
  namespace ip = boost::asio::ip;
  boost::asio::io_service io_service;

  // Server binds to any address and any port.
  ip::udp::socket socket(io_service,
                         ip::udp::endpoint(ip::udp::v4(), 0));
  socket.set_option(boost::asio::socket_base::broadcast(true));

  // Broadcast will go to port 8888.
  ip::udp::endpoint broadcast_endpoint(ip::address_v4::broadcast(), 8888);

  // Broadcast data.
  boost::array<char, 4> buffer;
 // socket.send_to(boost::asio::buffer(buffer), broadcast_endpoint);
  socket.async_send_to(boost::asio::buffer(buffer), broadcast_endpoint,
	  boost::bind(&handle_send));
  io_service.run();
  //std::thread run_thread([&]{ io_service.run(); });
  //run_thread.join();
}

客户端:

#include <iostream>

#include <boost/asio.hpp>
#include <boost/array.hpp>
int main()
{
  namespace ip = boost::asio::ip;
  boost::asio::io_service io_service;

  // Client binds to any address on port 8888 (the same port on which
  // broadcast data is sent from server).
  ip::udp::socket socket(io_service,
                         ip::udp::endpoint(ip::udp::v4(), 8888 ));

  ip::udp::endpoint sender_endpoint;

  // Receive data.
  boost::array<char, 4> buffer;
  std::size_t bytes_transferred =
    socket.receive_from(boost::asio::buffer(buffer), sender_endpoint);

  std::cout << "remote host ip : " << sender_endpoint.address().to_string() << std::endl;
 // std::cout << "got " << bytes_transferred << " bytes." << std::endl;
}

总结

上面的例子是阻塞模式的广播,有兴趣的可以把它修改成异步模式的,记得udp不是可靠的,上面的例子出处来自国外忘记,,。。。

ous 歌曲批量下载

本文描述osu音乐游戏,音乐批量下载。

韩国网站批量下载

  1. 打开血猫:http://bloodcat.com/osu,网站用的ajax技术,往下拉最下面异步加载更多
  2. 浏览器控制台输入:
    as = document.querySelectorAll("a"); r="";
    for( i=0;i<as.length;i++)
    {
    if(as[i].href.search("http://bloodcat.com/osu/s")!=-1){r+=(as[i].href+"n");}
    }
    console.log(r)
    console.log("end")
    
  3. 复制地址到迅雷,你懂得。

官方下载

  1. 打开官网:https://osu.ppy.sh/p/beatmaplist&s=4&r=0
  2. 谷歌浏览器控制台输入:
    as = document.querySelectorAll("a"); r="";
    for( i=0;i<as.length;i++)
    {
    if(as[i].href.search("https://osu.ppy.sh/d/")!=-1)//匹配字符
    if(as[i].href.search("n")==-1)//屏蔽最后字符n链接
    {r+=(as[i].href+"n");}
    }
    console.log(r)
    console.log("end")
  3. 复制地址到迅雷,这里需要注意,可能部分歌曲下载不到奥,可以跳过,看第四步
  4. 注册登录OSU账号,安装谷歌浏览器,安装下载插件(https://chrome.google.com/webstore/detail/chrono-download-manager/mciiogijehkdemklbdcbfkefimifhecn?hl=zh-CN),复制地址批量到里面,开始尽情下载。

总结

上面最大的难就是在控制台输入代码,里面是javascript代码,里面的正则表达式。代码思路是,把网页链接获取出来过滤。至于用谷歌浏览器,是因为它有批量插件。登录用户,才会自动获取到官方的真正下载地址。当然不是全部成功,我猜是官方的服务器处理不过来,如果你把下载失败地址,再重新打开,能下载到。

osu