小编Ale*_*der的帖子

地址已经与boost asio接受器一起使用

我写了一个服务器,它正在监听TCP连接和连接它的客户端.当我关闭服务器并在同一端口重新启动它时,我有时会在调用bind(...)时收到错误消息EADDRINUSE(Linux上的错误代码:98).即使我设置了重用套接字的选项,也会发生这种情况.

错误不会一直发生,但似乎当客户端连接到服务器并在关闭时发送数据时,它会更频繁地发生.我想问题是服务器关闭时仍有未决连接(相关主题:https://stackoverflow.com/questions/41602/how-to-forcibly-close-a-socket-in-time-wait).

在服务器端,我使用boost :: asio :: ip :: tcp :: acceptor.我使用选项"reuse_address"对其进行初始化(请参阅http://beta.boost.org/doc/libs/1_38_0/doc/html/boost_asio/reference/basic_socket_acceptor.html).这是代码片段:

using boost::asio::ip::tcp;
acceptor acceptor::acceptor(io_service);
endpoint ep(ip::tcp::v4(), port);
acceptor.open(ep.protocol());
acceptor.set_option(acceptor::reuse_address(true));
acceptor.bind(ep);
acceptor.listen();
Run Code Online (Sandbox Code Playgroud)

接受者关闭时:

acceptor.close();
Run Code Online (Sandbox Code Playgroud)

我之前也尝试过使用acceptor.cancel(),但它具有相同的效果.发生此错误时,我无法在同一端口上重启服务器很长一段时间.重新启动网络有帮助,但不是永久解决方案.

我错过了什么?

任何帮助将不胜感激!:)

c++ sockets boost boost-asio

10
推荐指数
1
解决办法
1万
查看次数

在C++中进行转换操作后在子进程中使用虚函数

我有以下代码:

class A
{
};

class B : public A
{
    public:
        virtual void f() {}
};

int main()
{
    A* a = new A();
    B* b = static_cast<B*>(a);
    b->f();
}
Run Code Online (Sandbox Code Playgroud)

该程序因分段错误而失败.有两种解决方案可以使这个程序工作:

  1. 声明f非虚拟
  2. 不要调用b-> f()(即它不会因为演员而失败)

但是,两者都不是一种选择.我认为这不起作用,因为在vtable中查找.

(在实际程序中,A也有虚函数.此外,在构造函数中不调用虚函数.)

有没有办法使这个程序工作?

c++

7
推荐指数
1
解决办法
420
查看次数

标签 统计

c++ ×2

boost ×1

boost-asio ×1

sockets ×1