2010-07-24 209 views
3

我正在学习boost/asio ad从电子书中编写了2个程序(客户端和服务器),只做了很小的修改。 基本上它应该连接到我的服务器。 当我尝试连接到外部世界(一些随机http服务器)一切都很好,它的工作原理,但当我改变目的地为“localhost:40002”它说无效的参数。C++ boost/asio客户端无法连接到服务器

客户端代码:

#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; 
} 

我做“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; 

} 

能有人暗示为什么连接不发生

+0

+1用于发布编译示例代码,它使得它更容易回答你的问题。 – 2010-07-24 18:01:44

回答

5

second parameterip::tcp::resolver::query是服务名称,而不是一个端口号:

boost::asio::ip::tcp::resolver::query query("localhost", 40002); 

应该

boost::asio::ip::tcp::resolver::query query("localhost", "40002"); 

仅供参考,当我在我的系统上编译代码失败:

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]’ 

我很惊讶它为你编译。

+0

我正在编译它在Linux上“g ++ -lboost_system -pthread client.cpp” – kurrata 2010-07-24 18:17:29

+1

我同样感到惊讶,它在VC 2008 Express上编译时加上boost 1.38 ... – 2010-07-24 18:20:27

相关问题