我一直在编写一个程序,通过网络从其他来源接收数据,我需要在发送数据进行处理之前对数据进行清理.以前,我一直在根据大小进行,如下所示:
char data[max_length];
boost::system::error_code error;
size_t length = sock->read_some( boost::asio::buffer( data ), error );
std::stringstream ss;
for( int i = 0; i < max_length; i++ ) {
ss << data[i];
}
std::vector<int> idata;
std::string s2 = ss.str();
s2.erase( 0, 255 );
Run Code Online (Sandbox Code Playgroud)
但我需要删除的标头长度可变.所以在做了一些挖掘后,我发现我可以通过查找我知道它们将结束的字符序列来删除它们 - 在这种情况下\r\n\r\n- 并删除所有内容直到那时使用size_t如下:
size_t p = s2.find( "\r\n\r\n" );
s2.erase( 0, p );
Run Code Online (Sandbox Code Playgroud)
但是这仍然留\r\n\r\n 在我的字符串的开头,它最多会抛弃我以后的数据处理,最坏的情况下,可能会导致问题,因为我的程序中有一些部分对空白没有很好的响应.
所以我的问题是:我是否有更好的方法可以删除并包含指定的字符序列?我可以这样做p = p + 4;吗?是否可以使用size_t类型?
这个问题应该比我的前几个简单一些.我在我的程序中实现了以下工作队列:
Pool.h:
// tpool class
// It's always closed. :glasses:
#ifndef __POOL_H
#define __POOL_H
class tpool {
public:
tpool( std::size_t tpool_size );
~tpool();
template< typename Task >
void run_task( Task task ){
boost::unique_lock< boost::mutex > lock( mutex_ );
if( 0 < available_ ) {
--available_;
io_service_.post( boost::bind( &tpool::wrap_task, this, boost::function< void() > ( task ) ) );
}
}
private:
boost::asio::io_service io_service_;
boost::asio::io_service::work work_;
boost::thread_group threads_;
std::size_t available_;
boost::mutex mutex_;
void wrap_task( boost::function< void() > task );
};
extern tpool …Run Code Online (Sandbox Code Playgroud) 我有一个程序,它使用工作队列来执行任务,并且应该作为守护进程运行.我使用以下代码实现了这一目标:
bool seedDaemon() {
using namespace std;
int childpid = 0;
pid_t pid = 0;
if( ( childpid = fork() ) < 0 ) {
return false;
}
else if( childpid > 0 ){
exit(0);
}
setsid();
umask(0);
std::cout<< "[OK]\n";
close( fileno(stderr) );
close( fileno(stdout) );
close( STDIN_FILENO );
return true;
}
Run Code Online (Sandbox Code Playgroud)
这将关闭原始进程并启动另一个进程.但是,这导致了我为执行任务而创建的线程在fork之后没有出现的问题.我的工作队列是全局实例化的,所有其他值和内存地址都正确地复制到子节点,但线程没有.
作为参考,这是池类:
pool.h:
#ifndef __POOL_H
#define __POOL_H
class tpool {
public:
tpool( std::size_t tpool_size );
~tpool();
template< typename Task >
void run_task( Task task ){ // add item …Run Code Online (Sandbox Code Playgroud)