2013-03-07 80 views
0

當我把一個非常簡單的C++程序聽一個給定的端口時,我遇到了一些麻煩。主要是,我在創建basic_resolver_query時遇到了問題。如果我這樣做:Boost的TCP basic_resolver_query構造函數的參數

boost::asio::ip::tcp::resolver::query query("0.0.0.0", "5938"); 

我的工作完美無瑕。但顯然,我不想對端口進行硬編碼,所以我一直試圖從文件中讀取它並傳遞給它:它不工作。

如果我試圖直接通過它std::string,它不起作用,我猜是可以預料的。但我試過傳球m_listenPort.c_string(),但它沒有做到。

我一直在尋找文檔,並在例子中,但我什麼都找不到。我該怎麼做呢?

+1

'c_string()'不存在作爲std :: string的成員,其''c_str()' – 2013-03-07 14:48:59

+0

什麼增壓版? – 2013-03-07 16:17:53

+0

請澄清什麼*不起作用*的意思,我們不介意讀者 – 2013-03-07 20:02:22

回答

2

是最好的,我可以告訴大家,boost::asio::ip::basic_resolver_query已施工的有兩個std::string參數自Boost.Asio的介紹。以下是1.351.53中的重載構造函數文檔。

#include <string> 
#include <boost/asio.hpp> 

int main() 
{ 
    std::string host = "127.0.0.1"; 
    std::string port = "1234"; 
    using boost::asio::ip::tcp; 
    tcp::resolver::query query1("127.0.0.1", "1234"); 
    tcp::resolver::query query2(host, port); 
    tcp::resolver::query query3(host.c_str(), port.c_str()); 
} 

是否有可能在不使用std::string或提供用戶定義的轉換的類型從該std::string可以構造一個類型?例如,std::string提供了c_str(),而不是c_string()。另外,它可以通過const char*而不是const unsigned char*const signed char*構建,因爲這三種類型是不同的。

+0

有趣的是,確實有3種字符類型(簽名,無符號和平原):http://stackoverflow.com/questions/436513/char-signed-炭炭無符號字符 – Paul 2016-07-21 13:34:46

2

對我來說,以下工作:

std::string host = "192.168.1.1", port = "1234"; 
tcp::resolver::query query(tcp::v4(), host, port); 
1

嘗試使用IP地址而不是URL時,我也遇到了一些問題。發現了創建端點的方法,並使用它在next_layer對象上的connect方法關閉套接字對象:

const boost::asio::ip::address IP(boost::asio::ip::address::from_string(serverPath)); 
int iport = atoi(port.c_str()); 
const boost::asio::ip::tcp::endpoint EP(IP, iport); 
// Set up an SSL context. 
boost::asio::ssl::context ctx(*IOService, boost::asio::ssl::context::tlsv1_client); 
// Specify to not verify the server certificiate right now. 
ctx.set_verify_mode(boost::asio::ssl::context::verify_none); 
// Init the socket object used to initially communicate with the server. 
pSocket = new boost::asio::ssl::stream<boost::asio::ip::tcp::socket>(*IOService, ctx); 
// 
// Try to connect to the server. Note - add timeout logic at some point. 
boost::system::error_code EC; 
pSocket->next_layer().connect(EP, EC); 
if (EC) 
{ 
    // Log an error. This worker thread should exit gracefully after this. 
    stringstream ss; 
    ss << "SSLSocket::Connect: connect failed to " << sClientIp << " : " << uiClientPort << ". Error: " << EC.message() + ".\n"; 
    Log.LogString(ss.str(), LogError); 
}