我有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";
}
}
如果您能提供一個能夠證明問題的完整程序,那麼這很有幫助。這允許我們將問題剪切/粘貼到編譯器中並查看問題。 – 2014-12-07 14:43:07
這樣做,謝謝。 – NorthernLight 2014-12-07 15:24:00
似乎在我的系統上工作 – 2014-12-07 15:43:37