我正在尝试在boost工作中获取daytime6服务器示例(异步UDP日间服务器)。我使用
编译以下程序g++ -std=c++11 -g -Wall -pedantic udp_server.cpp -o udp_server -lboost_system
我开始udp_server
。我可以看到使用netstat命令打开端口号13(UDP)。
但是如果我尝试使用netcat客户端到服务器
nc -u localhost 13
它似乎没有给出任何回复。但是我可以让异步TCP日间服务器正常工作。
#include <ctime>
#include <iostream>
#include <string>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/asio.hpp>
using boost::asio::ip::udp;
std::string make_daytime_string()
{
using namespace std; // For time_t, time and ctime;
time_t now = time(0);
return ctime(&now);
}
class udp_server
{
public:
udp_server(boost::asio::io_service& io_service)
: socket_(io_service, udp::endpoint(udp::v4(), 13))
{
start_receive();
}
private:
void start_receive()
{
socket_.async_receive_from(
boost::asio::buffer(recv_buffer_), remote_endpoint_,
boost::bind(&udp_server::handle_receive, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void handle_receive(const boost::system::error_code& error,
std::size_t /*bytes_transferred*/)
{
if (!error || error == boost::asio::error::message_size)
{
boost::shared_ptr<std::string> message(
new std::string(make_daytime_string()));
socket_.async_send_to(boost::asio::buffer(*message), remote_endpoint_,
boost::bind(&udp_server::handle_send, this, message,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
start_receive();
}
}
void handle_send(boost::shared_ptr<std::string> message,
const boost::system::error_code& error,
std::size_t bytes_transferred)
{
}
udp::socket socket_;
udp::endpoint remote_endpoint_;
boost::array<char, 1> recv_buffer_;
};
int main()
{
try
{
boost::asio::io_service io_service;
udp_server server(io_service);
io_service.run();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
答案 0 :(得分:1)
以下命令不会发送消息:
$ nc -u localhost 13
相反,netcat将等待,从stdin读取直到文件结束。收到文件结束后,它会使用UDP将其读取的消息发送到端口13上的localhost。
另一方面,以下命令:
$ echo 'msg' | nc -u localhost 13
写&#34; msg&#34;和netcat的stdin文件结束,导致netcat发送包含&#34; msg&#34;的UDP数据报。到13号端口的localhost。
asynchronous UDP daytime server示例以当前日期和时间响应收到的任何消息:
class udp_server
{
public:
udp_server(...)
{
start_receive();
}
private:
void start_receive()
{
socket_.async_receive_from(...,
boost::bind(&udp_server::handle_receive, ...));
}
void handle_receive(...)
{
message = make_daytime_string();
socket_.async_send_to(boost::asio::buffer(message), ...);
}
};
由于第一个命令不写消息,udp_server
永远不会收到它可以响应的消息。后一个命令会导致写入消息,udp_server
会响应日期和时间。
asynchronous TCP daytime server在接受连接时写入消息,然后关闭连接。使用TCP时,netcat将立即尝试连接到目标。在tcp_server
的情况下,netcat将建立TCP连接,接收日期和时间,检测远程对等体是否已关闭连接并退出。