小编Obl*_*s12的帖子

c ++删除序列之前的所有字符串,包括序列

我一直在编写一个程序,通过网络从其他来源接收数据,我需要在发送数据进行处理之前对数据进行清理.以前,我一直在根据大小进行,如下所示:

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类型?

c++ string find

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

带有阻塞的c ++工作队列

这个问题应该比我的前几个简单一些.我在我的程序中实现了以下工作队列:

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)

c++ multithreading boost-thread boost-asio threadpool

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

c ++在fork之后初始化全局对象

我有一个程序,它使用工作队列来执行任务,并且应该作为守护进程运行.我使用以下代码实现了这一目标:

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)

c++ multithreading boost daemons boost-thread

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