2014-12-07 116 views
0

我有wiith插口和數據包的煩惱...讓我解釋一下升壓緩衝區麻煩字符串

當客戶端發送「SE |布拉|藍光」,輸出是「重新|布拉|藍光」就像我想要的,但問題是,在CONSOL服務器中,輸出是「DataAsString = Se | Bla | Bluouh我們現在在這裏Noooo」。 所以我們可以看到它不會在writeAsync()中打印「我在這裏」,所以我們可以假設有一個錯誤,這就是我想要修復的問題,彈出窗口意味着:

調試斷言失敗!

程序:C:\ WINDOWS \ SYSTEM32 \ MSVCP120D.dll文件:C:\ Program Files文件 (x86)的\微軟的Visual Studio 12.0 \ VC \ \包括線路xstring:79

表達:字符串迭代器不defereenable

有關程序如何導致斷言失敗的信息,請參閱關於斷言的visual C++文檔。

(按重試來調試應用程序)[棄] [重試] [忽略]

我試圖調試它,但沒辦法,我不知道問題出在哪裏得來的。任何想法 ?

也許緩衝區不允許字符串?也許我必須重新初始化dataAsString和m_dataToRead到「」之後? 提前致謝,見。

編輯:完整:

#include <boost/asio.hpp> 
#include <boost/algorithm/string/split.hpp> 
#include <boost/algorithm/string.hpp> 
#include <cstdlib> 
#include <string> 
#include <vector> 
#include <iostream> 
#include <memory> 
#include <utility> 
#include "../configuration/constantes.h" 




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

     void start() 
     { 
      readAsync(); 
     } 

    private: 
     void readAsync() 
     { 
      auto self(shared_from_this()); 
      m_socket.async_read_some(boost::asio::buffer(m_dataToRead, 512), [this, self](boost::system::error_code error, std::size_t length) 
      { 
       if (!error) 
       { 
        packetsTreating(m_dataToRead, length); 
       } 
       start(); 
      }); 
     } 

     void writeAsync(std::string m_dataToSend, size_t length) 
     { 
      auto self(shared_from_this()); 
      boost::asio::async_write(m_socket, boost::asio::buffer(m_dataToSend, length), [this, self](boost::system::error_code error, std::size_t) 
      { 
       if (!error) 
       { 
        std::cout << "I am here"; 
        start(); 
       } 
      }); 
     } 

     void speak(std::string channel, std::string object) 
     { 
      std::cout << "Bouh"; 
      packetLength = 2 + sizeof(canal) + sizeof(objet); 
      std::cout << "We are here now"; 
      writeAsync(("Re|" + channel + "|" + object), packetLength); 
      std::cout << "Noooo"; 
     } 

     void logIn(std::string id, std::string wp) 
     { 

     } 

     void logOut(std::string whatDC) 
     { 

     } 

     void packetsTreating(char* data, size_t length) 
     { 
      std::string dataAsString; 
      dataAsString.assign(data, length); 
      std::cout << "DataAsString = " << dataAsString; 
      std::vector<std::string> fields; 
      boost::split(fields, dataAsString, boost::is_any_of("|")); 
      if (fields[0] == "Co" && fields.size() == 3) 
       logIn(fields[1], fields[2]); 
      else if (fields[0] == "Dc" && fields.size() == 2) 
       logOut(fields[1]); 
      else if (fields[0] == "Se" && fields.size() == 3) 
       speak(fields[1], fields[2]); 
      else 
       std::cout << "Unknown command." << std::endl; 
     } 
     size_t packetLength = 0; 
     boost::asio::ip::tcp::socket m_socket; 
     char m_dataToRead[512]; 
}; 

class server 
{ 
public: 
    server(boost::asio::io_service& ios, 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 && connectedPerso <= maxConnec) // maxConnec is in constantes.h, = 250 
      { 
       connectedPerso++; // Btw, do you know how to -- it when a client disconnect ? 
       std::cout << "Connection, there is " << connectedPerso << " clients." << std::endl; 
       std::make_shared<client>(std::move(m_socket))->start(); 
      } 
      acceptConnection(); 
     }); 
    } 
    unsigned short connectedPerso = 0; 
    boost::asio::ip::tcp::acceptor m_acceptor; 
    boost::asio::ip::tcp::socket m_socket; 
}; 

void main() 
{ 
    try 
    { 
     std::cout << "TCP open on port " << port << ". maxConnec is " << maxConnec << "." << std::endl; 
     boost::asio::io_service iosConnector; 
     serveur serveur(iosConnector, port); // port = 2013 
     iosConnector.run(); 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << "Exception : " << e.what() << "\n"; 
    } 
} 
+0

如果您能提供一個能夠證明問題的完整程序,那麼這很有幫助。這允許我們將問題剪切/粘貼到編譯器中並查看問題。 – 2014-12-07 14:43:07

+0

這樣做,謝謝。 – NorthernLight 2014-12-07 15:24:00

+0

似乎在我的系統上工作 – 2014-12-07 15:43:37

回答

1

有一個邏輯錯誤。您正在從同步寫入處理程序和同步讀取處理程序調用start()。由於start()在套接字上調用async_read,所以在第一次寫入之後,您將最終在套接字上有2個活動的異步讀取。這是非法的。

+0

然後,我在writeAsync中刪除了start()。謝謝。 – NorthernLight 2014-12-07 17:21:36

0

答案提供證明您發佈的代碼似乎我的系統上運行:

$ telnet localhost 2013 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 
hello 
hello 
ccccc 
Re|1|hello| 
Se|channel|text 
Re|channel|text 
Se|channel|text 
Re|channel|text 
Se|channel|text 
Re|channel|text 
^] 
telnet> close 
Connection closed. 

標準輸出:

Connection, there is 1 clients. 
DataAsString = hello 
Unknown command. 
DataAsString = hello 
Unknown command. 
DataAsString = ccccc 
Unknown command. 
DataAsString = Re|1|hello| 
Unknown command. 
DataAsString = Se|channel|text 
BouhWe are here nowNooooI am hereDataAsString = Se|channel|text 
BouhWe are here nowNooooI am hereDataAsString = Se|channel|text 
+0

鏗鏘3.5,在OSX上附帶Xcode 6 – 2014-12-07 17:10:28

+0

哦,其實它不能在調試模式下工作,但在發佈模式下它的工作原理......謝謝理查德霍奇斯。順便說一下,你有什麼想法,爲什麼它不在調試? – NorthernLight 2014-12-07 17:11:55