首先,我想說的是,我是一名C++初學者,總體來說,儘管我對Java和C#等語言有一定的經驗。增強套接字問題
這就是說,我通過Boost TCP套接字傳輸數據時遇到問題。我使用此代碼:
派:
tcp::socket s(io_service);
boost::asio::connect(s, iterator);
string response = static_cast<ostringstream*>(&(ostringstream() << arg1))->str()
+ "," + static_cast<ostringstream*>(&(ostringstream() << arg2))->str()
+ "," + static_cast<ostringstream*>(&(ostringstream() << arg3))->str()
+ "," + static_cast<ostringstream*>(&(ostringstream() << arg4))->str()
+ "," + static_cast<ostringstream*>(&(ostringstream() << arg5))->str()
+ "," + static_cast<ostringstream*>(&(ostringstream() << arg6))->str();
//pad the rest
while (response.length() < max_length)
{
response += ' ';
}
boost::asio::write(s, boost::asio::buffer(response, sizeof(response)));
爲:
tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port));
while(true)
{
socket_ptr sock(new tcp::socket(io_service));
a.accept(*sock);
boost::thread t(boost::bind(session, sock));
}
...
void session(socket_ptr sock)
{
char data[max_length];
size_t length;
try
{
while(true)
{
boost::system::error_code error;
//size_t length = sock->read_some(boost::asio::buffer(data), error);
length = boost::asio::read(*sock, boost::asio::buffer(data, sizeof data));
std::cout << "Length " << length << endl;
if (error == boost::asio::error::eof)
{
break; // Connection closed cleanly by peer.
}
else if (error)
{
throw boost::system::system_error(error); // Some other error.
}
}
}
catch (std::exception& e)
{
std::cout << data << endl;
string message = e.what();
if(std::string::npos != message.find(END_OF_FILE))
{
domeSomethingWithTheData(data);
memset(data, 0, sizeof data);
}
else
{
std::cout << data <<endl;
std::cerr << "Exception in thread: " << e.what() << "\n";
}
}
}
我無法理解的是,無論我用,(無論是boost::asio::read
或sock->read_some
)我從來沒有得到超過32個字符的數據。我曾嘗試將緩衝區的大小增加到2048
,但問題依然存在。
緩衝區總是包含超過32個字符(其中大部分是垃圾),但我假設這些實際上並不是從客戶端發送的,而是來自服務器端的緩衝區的實際分配,因爲std::cout << "Length " << length
打印out 32.
有關我如何從客戶端發送任意數量的字符到服務器的任何信息,我們將不勝感激。
編輯:
由拉法爾Rawicki提供的三分球之後,我現在使用此代碼:
boost::asio::streambuf buffer;
boost::asio::read_until(*sock, buffer, '\n');
std::istream is(&buffer);
std::string line;
std::getline(is, line);
std::cout << line << std::endl;
的客戶端仍然與我在結尾處增加一個\n
唯一的例外不變。但是,這會產生很多End of file
異常。
感謝您的指針。我已經讀過'read_some'不能保證返回所有的數據,但是我不知道'read'也適用。我現在試圖使用'read_until'。問題是,它似乎工作,但是,我收到了很多'文件結束'異常。你有什麼想法我可以通過這個嗎?我將更新我現在正在使用的代碼。 – npinti
@npinti我已經在Boost文檔中的適當重載的答案中鏈接了兩個讀取 - 它僅適用於'read'的特定重載。 –
@npinti'boost :: asio :: buffer(response,sizeof(response)));' - 這行是完全錯誤的,** use:'boost :: asio :: buffer(response);'**。 Sizeof不返回字符串的有效大小。 'boost :: asio :: buffer'有一個字符串重載,如果你想這樣做,它應該是'boost :: asio :: buffer(response.c_str(),response.size())) ;' –