当前位置: 首页 > 知识库问答 >
问题:

我无法用网络TS重写Boost::ASIO教程。我的代码怎么了?

邹华池
2023-03-14

我尝试制作本教程的网络TS版本:https://www.boost.org/doc/libs/1_75_0/doc/html/boost_asio/tutorial/tutdaytime2/src.html

首先,我编译并运行了boost版本,它运行得很好。

然后我写了这样的话:

#include <ctime>
#include <iostream>
#include <string>

#include <experimental/net>
namespace net = std::experimental::net;

/////////////////////////////////////////////////////////////////////////////
std::string make_daytime_string()
/////////////////////////////////////////////////////////////////////////////
{
 time_t now = std::time(0);
 const std::string result = std::ctime(&now);
 std::cout << "sending: " << result << '\n';
 return result;
}

/////////////////////////////////////////////////////////////////////////////
int main()
/////////////////////////////////////////////////////////////////////////////
{
 try
 {
  net::io_context io_context;

  net::ip::tcp::acceptor acceptor
  (
   io_context,
   net::ip::tcp::endpoint(net::ip::tcp::v4(), 8013)
  );

  while (true)
  {
   net::ip::tcp::socket socket(io_context);
   acceptor.accept(io_context);
   net::write(socket, net::buffer(make_daytime_string()));
  }
 }
 catch (std::exception& e)
 {
  std::cerr << e.what() << std::endl;
 }

 return 0;
}

我正在使用网络ts的实现:https://github.com/chriskohlhoff/networking-ts-impl

我正在Ubuntu20.04LTS中使用gcc进行编译。

服务器代码编译并运行。但一旦客户端建立连接,它就会失败,但有以下例外情况:

write: Bad file descriptor

,而客户端没有收到任何东西。我的代码看起来真的和asio的一样。为什么会失败?

共有1个答案

公冶光亮
2023-03-14
   net::ip::tcp::socket socket(io_context);
   acceptor.accept(io_context);

您将丢弃连接的套接字(并从已经传递给accept的执行上下文中冗余地构造一个套接字)。

用修复

    auto socket = acceptor.accept(io_context);
 类似资料:
  • 问题内容: 这是我的整个源代码: 代码卡在了 fmt.Println(“ enq =”,t)上, 但是我不知道为什么,这太奇怪了。 问题答案: deQueue在失败情况下无限循环,这阻塞了CPU。Goroutine在执行CPU工作时不会屈服。GOMAXPROCS必须大于等于2才能获得CPU并行性。 只是为了踢,这是使用高阶通道的线程安全,无阻塞队列实现:https : //gist.github.

  • 根据http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/overview/cpp2011/futures.html,我们可以将boost::asio与一起使用。但是我找不到任何有关使用的信息,它具有更多的功能,例如。我怎么用?

  • topAncestorElement 的类型是 call 的返回值 undefined; 我希望使用 [].find.call 这种写法,要怎么修改呢? as unknown as HTMLElement 这样断言就行了。之前没注意看提示...

  • 问题内容: 我已经使用Selenium用Java编写了代码。当我运行代码时,它将引发NullPointerException。检查以下异常 我的代码如下: 问题答案: 您会看到一个原因,因为您从一开始就尝试访问该方法,这需要in的活动实例,即to &and perform 方法。 解决方案是先访问该方法,以便您拥有and 的活动实例。接下来,您可以访问方法。 这是您的工作代码块:

  • 我使用Selenium编写了Java代码。当我运行代码时,它会抛出NullPointerException。检查下面的异常 我的代码如下: