2014-12-04 68 views
0

我在Boost asio的包有麻煩,讓我解釋一下。Boost Asio - 客戶端到服務器奇怪的輸出

#include <boost/asio.hpp> 
#include <cstdlib> 
#include <iostream> 
#include <memory> 
#include <utility> 
#include "../configuration/constants.h" // port = 2013 ; maxLength = 512 

class client : public std::enable_shared_from_this<client> 
{ 
public: 
    client(boost::asio::ip::tcp::socket socket) : m_socket(std::move(socket)){} 

    void start() 
    { 
     read(); 
    } 

private: 
    void read() 
    { 
     auto self(shared_from_this()); 
     m_socket.async_read_some(boost::asio::buffer(m_data, sizeof(m_data)), [this, self](boost::system::error_code error, std::size_t length) 
     { 
      if (!error) 
      { 
       std::cout << m_data; 
       send(length); 
      } 
     }); 
    } 

    void send(std::size_t length) 
    { 
     auto self(shared_from_this()); 
     boost::asio::async_write(m_socket, boost::asio::buffer(m_data, length), [this, self](boost::system::error_code error, std::size_t) 
     { 
      if (!error) 
      { 
       start(); 
      } 
     }); 
    } 

    boost::asio::ip::tcp::socket m_socket; 
    char m_data[maxLength]; 
}; 

class server 
{ 
public: 
    server(boost::asio::io_service& ios, unsigned short port) : m_acceptor(ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)), m_socket(ios) 
    { 
     acceptConnection(); 
    } 

private: 
    void acceptConnection() 
    { 
     m_acceptor.async_accept(m_socket, [this](boost::system::error_code error) 
     { 
      if (!error) 
       std::make_shared<client>(std::move(m_socket))->start(); 
      acceptConnection(); 
     }); 
    } 
    boost::asio::ip::tcp::acceptor m_acceptor; 
    boost::asio::ip::tcp::socket m_socket; 
}; 

void connexionTCP() 
{ 
    try 
    { 
     std::cout << "TCP open" << std::endl; 
     boost::asio::io_service iosConnector; 
     server server(iosConnector, port); // port = 2013 
     iosConnecteur.run(); 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << "Exception : " << e.what() << "\n"; 
    } 
} 

如果我嘗試運行它,TCP open是輸出。如果客戶端發送 「你好」 時,輸出(控制檯)爲:

HiÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͲ²²²½½½½½½½½

最後的代碼完成。任何想法 ?順便說一下,當我使用puTTY作爲客戶端時,當我發送「Hi」時,我收到「Hi」。這只是在寫給我這個控制檯。

在此先感謝

回答

0

嗯,我做到了。 當我讀了一些東西,數據長度是在變量size_t長度。 所以,從它,我所做的:

if (!error) // If there is no error 
    { 
     for (int i = 0; i < (length); i++) // If i < length 
     { 
      std::cout << m_data[i]; // Print every char since i < length 
      if (i == length) // Just to make the output more presentable 
       std::cout << "\n"; // Enter 
     } 
    start(); // Back to the begining. 
} 

輸入: 「嗨」 輸出繼電器: 「嗨」 \ n

感謝您的幫助,德拉克斯和sehe。再見。

我現在的問題是,目前我無法在std :: string中存儲m_data,因爲它存在於for中。我嘗試過載體,但沒辦法。我想得到它,因爲它比使用char更容易處理字符串。 所以我想要做的是:獲取for的輸出m_data在一個字符串中。

0

將一個'\0'在你的字符數組的結束可以在打印前:)

if (!error) 
{ 
    m_data[length] = '\0'; 
    std::cout << m_data; 
    send(length); 
} 
+0

更好:只寫入你有'std :: cout.write(m_data,length)'的數據'否則你只是最後一個字符被破壞如果'length == maxlength' – sehe 2014-12-04 18:37:06

+0

@Drax你的代碼編譯,但是這個只刪除「²²²½½½½½½½½½」。該「ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ」是存在的。 sehe:你的代碼也可以編譯,但是隻需要寫兩次消息。感謝您的幫助,但我想要做的是刪除那些2.我雖然關於分離器,但我不認爲在網絡處理器這是一個好主意。 – NorthernLight 2014-12-04 18:56:15

+0

@NorthernLight號我的代碼不寫信息兩次。如果它似乎這樣做,你在這樣做的其他代碼:)(你是否有機會在一個控制檯上混合輸出「發送者」和「接收者」?) – sehe 2014-12-04 22:15:48

相關問題