kur*_*ata 3 c++ linux networking boost-asio
我正在学习boost/asio ad从电子书中写了2个程序(客户端和服务器),只做了一些小改动.基本上它应该连接到我的服务器.当我尝试连接到外部世界(一些随机的http服务器)时,一切都很好并且它可以工作,但是当我将目标更改为"localhost:40002"时,它表示无效的参数.
客户代码:
#include <boost/asio.hpp>
#include <iostream>
int main () {
try {
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver::query query("localhost", 40002);
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::iterator destination = resolver.resolve(query);
boost::asio::ip::tcp::resolver::iterator end ;
boost::asio::ip::tcp::endpoint endpoint;
while ( destination != end ) {
endpoint = *destination++;
std::cout<<endpoint<<std::endl;
}
boost::asio::ip::tcp::socket socket(io_service);
socket.connect(endpoint);
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我做了"netstat -l",它表明我真的在听我的端口所以服务器我觉得有效,但从不减少他们不连接
服务器代码:
#include <boost/asio.hpp>
#include <iostream>
#include <string>
#include <ctime>
std::string time_string()
{
using namespace std;
time_t now = time(0);
return ctime(&now);
}
int main () {
try {
boost::asio::io_service io_service;
boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 40002));
for (; ;) {
std::cout<<"Listening to"<<std::endl;
boost::asio::ip::tcp::socket socket(io_service);
acceptor.accept(socket);
std::string message = time_string();
boost::system::error_code ignored_error;
boost::asio::write(socket, boost::asio::buffer(message), boost::asio::transfer_all(), ignored_error);
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以暗示为什么连接不会发生
在第二个参数来ip::tcp::resolver::query
是服务名称,而不是一个端口号:
boost::asio::ip::tcp::resolver::query query("localhost", 40002);
Run Code Online (Sandbox Code Playgroud)
应该
boost::asio::ip::tcp::resolver::query query("localhost", "40002");
Run Code Online (Sandbox Code Playgroud)
fyi,当我在我的系统上编译你的代码时,它失败了:
resolve.cc: In function ‘int main()’:
resolve.cc:7: error: invalid conversion from ‘int’ to ‘boost::asio::ip::resolver_query_base::flags’
resolve.cc:7: error: initializing argument 2 of ‘boost::asio::ip::basic_resolver_query<InternetProtocol>::basic_resolver_query(const std::string&, boost::asio::ip::resolver_query_base::flags) [with InternetProtocol = boost::asio::ip::tcp]’
Run Code Online (Sandbox Code Playgroud)
我很惊讶它为你编译.