这实际上是我在套接字编程方面的第一个程序,而不是复制粘贴教程代码并从中获得乐趣。无论如何它不起作用。我想我已经仔细阅读了文档,但也许还不够。我怀疑我在 read_message() 中使用了 socket::read_some(),因为我有问题的程序在读取部分停止了。我认为我使用它的方式应该没问题,因为 socket::read_some() 的文档指出“函数调用将阻塞,直到一个或多个字节的数据被成功读取,或者直到一个发生错误。”下面是我的代码。任何帮助表示赞赏。
void read_message(std::string& message, boost::asio::ip::tcp::socket& socket)
{
std::stringstream message_stream;
while (true)
{
std::array<char, 128> buffer;
boost::system::error_code error;
size_t len = socket.read_some(boost::asio::buffer(buffer), error);
if (error == boost::asio::error::eof)
{
break;
}
message_stream.write(buffer.data(), len);
}
message = message_stream.str();
}
服务器.cpp
int main()
{
while (true)
{
boost::asio::io_service io_service;
boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(
boost::asio::ip::tcp::v4(), 9999));
boost::asio::ip::tcp::socket socket(io_service);
acceptor.accept(socket);
std::cout << "connected with client, waiting for a message\n";
std::string message;
read_message(message, socket);
boost::asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();
std::cout << "message received from " << endpoint.address().to_string() <<
':' << endpoint.port() << '\n' << message << '\n';
boost::asio::write(socket, boost::asio::buffer(message));
if (message.compare("quit") == 0)
{
break;
}
}
return EXIT_SUCCESS;
}
客户端.cpp
int main()
{
while (true)
{
std::cout << "your message to be sent: ";
std::string message;
std::getline(std::cin, message);
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query("localhost", "9999");
boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
boost::asio::ip::tcp::socket socket(io_service);
boost::asio::connect(socket, endpoint_iterator);
std::cout << "connected to server\n";
boost::asio::write(socket, boost::asio::buffer(message));
read_message(message, socket);
std::cout << "message received from server: " << message << '\n';
if (message.compare("quit") == 0)
{
break;
}
}
return EXIT_SUCCESS;
}
最佳答案
问题出在 read_message 函数中:您一直读取到 eof,但只有当套接字关闭时您才会收到 eof。
也许您打算在遇到某些分隔符时从 read_message 返回,例如。 '\n'?然后您可以手动检查缓冲区,或使用 read_until功能。
使用 read_until 函数,read_message 将如下所示:
void read_message(std::string& message, boost::asio::ip::tcp::socket& socket)
{
std::stringstream message_stream;
boost::asio::streambuf buffer;
boost::system::error_code error;
size_t len = read_until(socket, buffer, '\n', error);
if (len)
{
message_stream.write(boost::asio::buffer_cast<const char *>(buffer.data()), len);
message = message_stream.str();
}
}
请记住在您从客户端发送的消息中附加“\n”:
//...
std::cout << "connected to server\n";
boost::asio::write(socket, boost::asio::buffer(message + '\n'));
read_message(message, socket);
//...
关于c++ - boost::asio::ip::tcp::socket 不读取任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26957299/
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s