这合法吗?:
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;
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秒,会发生什么?它会立即开火吗?
在为工作中的客户端/服务器系统构建单元测试时,我遇到了一个问题,即在我关闭所有活动处理程序(我知道)后,我的io_service没有释放.
经过一天的代码搜索后,我遇到了错误的处理程序,该处理程序尚未集成到我的客户端关闭程序中.
我的问题是:是否有一种简单的方法可以在boost io_service中列出当前活动的处理程序?如果没有,为什么不呢?
任何见解将不胜感激.
所以我创建了一个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) boost::asio TCP 套接字接受/读/写都提供异步版本,但不关闭。
在我的代码中,我只是调用了 socket.close(),并且大部分时间它都可以正常工作。它触发了正常的 TCP 关闭。
但有时,close() 只是在没有关闭 TCP 的情况下关闭套接字。因此,我必须改为调用 shutdown()。但我不想阻止我的代码。在 boost:asio 中,shutdown() 是否阻塞?关闭()怎么样?close() 是否阻塞?
当我尝试用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) 我想从配置文件中重新加载一些值。我知道,po::store如果值存在于中,则不会更改variables_map。是否有替代方法即使值已经存在也可以替换?
我尝试从中删除要重新加载的值variables_map,但是po::store无论如何都不会添加新值(即使也无法访问旧值)。
简而言之,我的问题是,如果您有一台只有一个活动连接的 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 一周,这是我第一次在这样的论坛上发帖,所以对我要宽容;)。
我刚刚开始使用boost.我正在使用异步套接字编写TCP客户端服务器.
任务如下:
现在工作如下
如何允许客户端从键盘输入数字并同时等待服务器的回答?
为什么我的客户不等待服务器的答案?
客户端代码:
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) 我想验证我为Linux编写和编译的C++应用程序的内存稳定性.它是一个网络应用程序,以每秒10-20个连接的速率响应远程客户端连接.从长远来看,内存增加到50MB,尽管应用程序正在调用删除...
调查显示Linux没有立即释放内存.所以这是我的问题:
如何强制Linux释放我实际释放的内存?至少我想这样做一次以验证内存稳定性.否则,是否有可靠的内存指示器可以报告我的应用实际持有的内存?
c++ ×9
boost ×8
boost-asio ×7
asynchronous ×2
tcp ×2
client ×1
linux ×1
makefile ×1
memory ×1
memory-leaks ×1
shutdown ×1
sockets ×1
stl ×1