小编Sam*_*ler的帖子

reference front和pop_front

这合法吗?:

Sample& sample = stack.front();
stack.pop_front();
Run Code Online (Sandbox Code Playgroud)

我的程序有效.但Sample类有boost::optional<boost::posix_time::ptime> xxx成员和after pop_front,is_initialized()返回false;

c++ stl

6
推荐指数
1
解决办法
2955
查看次数

需要解释此boost :: asio计时器示例

Boost asio的第3个教程中有一行显示了如何更新计时器并防止其漂移.该行如下:

 t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
Run Code Online (Sandbox Code Playgroud)

也许是我,但我无法找到关于e的第二次使用的文档xpires_at(),没有参数.expires_at(x)设置新的到期时间,取消任何待处理的完成处理程序.所以推测expires_at()会做什么,最后一次到期的返回时间?因此,通过增加一秒,如果应该有一些ms,比如说n ms,那么它本质上将从下一个到期时"减去",因为时间被计算在内?如果在此示例中执行此处理程序所需的时间大于1秒,会发生什么?它会立即开火吗?

c++ boost boost-asio

5
推荐指数
1
解决办法
1282
查看次数

列出boost io_service中的活动处理程序

在为工作中的客户端/服务器系统构建单元测试时,我遇到了一个问题,即在我关闭所有活动处理程序(我知道)后,我的io_service没有释放.

经过一天的代码搜索后,我遇到了错误的处理程序,该处理程序尚未集成到我的客户端关闭程序中.

我的问题是:是否有一种简单的方法可以在boost io_service中列出当前活动的处理程序?如果没有,为什么不呢?

任何见解将不胜感激.

c++ boost boost-asio

5
推荐指数
1
解决办法
331
查看次数

boost :: asio异步操作和资源

所以我创建了一个socket类,它使用boost :: asio库来进行异步读写.它有效,但我有几个问题.

这是一个基本的代码示例:

class Socket
{
public:
    void doRead()
    {
        m_sock->async_receive_from(boost::asio::buffer(m_recvBuffer), m_from, boost::bind(&Socket::handleRecv, this, boost::asio::placeholders::error(), boost::asio::placeholders::bytes_transferred()));
    }

    void handleRecv(boost::system::error_code e, int bytes)
    {
        if (e.value() || !bytes)
        {
            handle_error();
            return;
        }
        //do something with data read
        do_something(m_recvBuffer);

        doRead(); //read another packet
    }

protected:
    boost::array<char, 1024> m_recvBuffer;
    boost::asio::ip::udp::endpoint m_from;
};
Run Code Online (Sandbox Code Playgroud)

程序似乎会读取数据包,处理它,然后准备读取另一个数据包.简单.但是,如果我设置一个线程池呢?下一次调用应该doRead()在处理读取数据之前还是之后?似乎如果它被放在之前do_something(),程序可以立即开始读取另一个数据包,如果它被放在后面,那么线程就会做任何事情do_something(),这可能需要一段时间.如果我把它放在doRead()处理之前,这是否意味着在m_readBuffer我处理它时数据可能会改变?

另外,如果我正在使用async_send_to(),我是否应该将要发送的数据复制到临时缓冲区中,因为实际发送可能要么在数据超出范围之后才会发生?即

void send()
{
    char data[] = {1, 2, 3, 4, 5};
    m_sock->async_send_to(boost::buffer(&data[0], 5), someEndpoint, someHandler);
} …
Run Code Online (Sandbox Code Playgroud)

c++ boost asynchronous boost-asio

5
推荐指数
1
解决办法
1063
查看次数

boost::asio tcp 套接字关闭是否阻塞?

boost::asio TCP 套接字接受/读/写都提供异步版本,但不关闭。

在我的代码中,我只是调用了 socket.close(),并且大部分时间它都可以正常工作。它触发了正常的 TCP 关闭。

但有时,close() 只是在没有关闭 TCP 的情况下关闭套接字。因此,我必须改为调用 shutdown()。但我不想阻止我的代码。在 boost:asio 中,shutdown() 是否阻塞?关闭()怎么样?close() 是否阻塞?

boost asynchronous tcp shutdown boost-asio

5
推荐指数
1
解决办法
4583
查看次数

我尝试编译时使用boost的未定义引用

当我尝试用boost编译我的服务器时,我有很多错误.这是我的makefile:

NAME    =       serveur

SRCS    =       Serveur/main.cpp                \
                Serveur/Client.cpp              \
                Serveur/Commande.cpp            \
                Serveur/My_exception.cpp        \
                Serveur/Network.cpp             \
                Serveur/Server.cpp

#####################################################                                                                                                                                                          

OBJS                    =       $(SRCS:.cpp=.o)
CC                      =       g++
RM                      =       rm -f
CFLAGS                  =       -g -W -Wall -Werror
INCL                    =       ./Serveur/boost_1_47_0
LIB                     =       ./Serveur/boost_1_47_0/stage/lib/
NLIB                    =       -lboost_system -lboost_system-mt -lboost_filesystem -lboost_filesystem-mt

#####################################################                                                                                                                                                          

$(NAME) :       $(OBJS)
        @$(CC) $(OBJS) -I$(INCL) -L$(LIB) $(NLIB) -o $(NAME)
        @printf "\n \033[33m[Message]\033[39m Compilation under Linux done\n\n"

.cpp.o  :
        @$(CC) $(CFLAGS) -I$(INCL) -L$(LIB) $(NLIB) -c $< -o $@
        @printf " \033[34m[Compilation]\033[39m %s\n" $< …
Run Code Online (Sandbox Code Playgroud)

c++ boost makefile boost-asio

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

boost :: program_options如何重新加载值

我想从配置文件中重新加载一些值。我知道,po::store如果值存在于中,则不会更改variables_map。是否有替代方法即使值已经存在也可以替换?

我尝试从中删除要重新加载的值variables_map,但是po::store无论如何都不会添加新值(即使也无法访问旧值)。

c++ boost boost-program-options

5
推荐指数
2
解决办法
2307
查看次数

Boost asio tcp,为什么我不能在服务器端只有一个数据套接字可以打开和关闭

简而言之,我的问题是,如果您有一台只有一个活动连接的 tcp 服务器,您可以只创建一个服务器端数据套接字吗?在所有教程中,我看到创建了一个新套接字,但我不明白为什么会出现这种情况。为什么不创建一个服务器端套接字,然后打开、关闭、重置它(我最初希望 async_accept 以某种方式做到了)?

更详细地说:

我已经完成了异步日间服务器的 boost asio 教程,并且可以让它编译和工作。我什至可以为我的应用程序修改它并让它按照我的意愿运行:)。然而,我原来的方法不起作用,我不明白为什么,这就是我希望得到你的帮助的地方。

基本上我想创建一个 TCP 服务器,它只接受一个 TCP 客户端并忽略所有其他客户端,除非第一个客户端断开连接。我使用acceptor.close()和acceptor.open()来做到这一点,这样当第一个连接被接受时,我只是关闭了接受器,然后每当我发现一个eof错误时,我就重新打开接受器来监听新的连接。我天真地认为,因为我只想要一个活动连接,所以我只需要创建一个:

boost::asio::ip::tcp::socket socket_
Run Code Online (Sandbox Code Playgroud)

由于我只有一个数据套接字从客户端接收数据,因此根据教程创建整个 tcp_connection 类似乎有点过分,据我所知,它只返回一个用 io_service 构造的新套接字。(在本教程中,我认为每次服务器接受新连接时,都会使用此代码创建新套接字):

class tcp_connection
  : public boost::enable_shared_from_this<tcp_connection>
{
 public:
  typedef boost::shared_ptr<tcp_connection> pointer;

  static pointer create(boost::asio::io_service& io_service)
  {
    return pointer(new tcp_connection(io_service));
  }

  tcp::socket& socket()
  {
    return socket_;
  }


 private:
  tcp_connection(boost::asio::io_service& io_service)
    : socket_(io_service)
  {
  }

  tcp::socket socket_;
  std::string message_;
};
Run Code Online (Sandbox Code Playgroud)

因此,我尝试只使用一个 boost::asio::ip::tcp::socket。我使用 io_service 以与上面教程类似的方式在服务器类的构造函数中初始化了它。我的测试表明,我的第一个客户端会连接,只有在第一个客户端断开连接后,第二个客户端才会连接。但是,无论我做什么, async_accept(socket_,.....) 调用上的数据缓冲区都永远不会被填满。最初我只是不断收到 eof 错误,然后我尝试关闭 socked 并重新打开,这消除了 eof 错误并给出了传输端未连接错误。显然我在这里做了一些非常愚蠢的事情,但我看不出从哲学上讲我想做的事情有什么问题。当我使用教程技术创建一个新套接字时,一切都按预期工作。

所以我的问题是我可以只有一个套接字并执行诸如取消、关闭、打开之类的操作吗?我是要绑定还是其他东西,但这不是 async_accept 工作吗?

我现在只使用了 boost asio 一周,这是我第一次在这样的论坛上发帖,所以对我要宽容;)。

c++ sockets boost tcp boost-asio

5
推荐指数
1
解决办法
1866
查看次数

提升异步tcp客户端

我刚刚开始使用boost.我正在使用异步套接字编写TCP客户端服务器.

任务如下:

  1. 客户端向服务器发送一个号码
  2. 客户端可以在收到服务器的答案之前发送另一个nubmer.
  3. 服务器接收一个号码,用它做一些计算并将结果发送回客户端.
  4. 多个客户端可以连接到服务器.

现在工作如下

  • 从客户端向服务器发送号码
  • 服务器接收当前线程中的数字并在OnReceive处理程序中计算(我知道这很糟糕......但我应该如何开始一个新的线程来并行执行计算)
  • 服务器发回应答但客户端已断开连接

如何允许客户端从键盘输入数字并同时等待服务器的回答?

为什么我的客户不等待服务器的答案?

客户端代码:

using boost::asio::ip::tcp;

class TCPClient
{
    public:
        TCPClient(boost::asio::io_service& IO_Service, tcp::resolver::iterator EndPointIter);
        void Close();

    private:
        boost::asio::io_service& m_IOService;
        tcp::socket m_Socket;

        string m_SendBuffer;
        static const size_t m_BufLen = 100;
        char m_RecieveBuffer[m_BufLen*2];

        void OnConnect(const boost::system::error_code& ErrorCode, tcp::resolver::iterator EndPointIter);
        void OnReceive(const boost::system::error_code& ErrorCode);
        void OnSend(const boost::system::error_code& ErrorCode);
        void DoClose();
};

TCPClient::TCPClient(boost::asio::io_service& IO_Service, tcp::resolver::iterator EndPointIter)
: m_IOService(IO_Service), m_Socket(IO_Service), m_SendBuffer("")
{
    tcp::endpoint EndPoint = *EndPointIter;

    m_Socket.async_connect(EndPoint,
        boost::bind(&TCPClient::OnConnect, this, boost::asio::placeholders::error, ++EndPointIter));
}

void TCPClient::Close()
{
    m_IOService.post( …
Run Code Online (Sandbox Code Playgroud)

c++ client boost boost-asio

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

Linux中C++应用程序的内存稳定性

我想验证我为Linux编写和编译的C++应用程序的内存稳定性.它是一个网络应用程序,以每秒10-20个连接的速率响应远程客户端连接.从长远来看,内存增加到50MB,尽管应用程序正在调用删除...

调查显示Linux没有立即释放内存.所以这是我的问题:

如何强制Linux释放我实际释放的内存?至少我想这样做一次以验证内存稳定性.否则,是否有可靠的内存指示器可以报告我的应用实际持有的内存?

c++ linux memory memory-leaks

5
推荐指数
2
解决办法
2542
查看次数