打印

两个进程通过fifo进行通信和解析

[复制链接]
574|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2022-9-27 13:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#申请原创# #技术资源# 可以监控终端的输入和其他程序写在此FIFO的数据,并对特殊字段进行解析。
运行环境:qnx

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>  
#include <iostream>
#include<regex>



//int mkfifo( const char* path,
//            mode_t mode );

using namespace std;

#include <string>

void test()
{
        std::regex reg("-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*))\\sMbits");
        std::regex reg1("-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*))");

        std::string str = "这是中文示例abc 1234.2  a 匹配浮点数值XX5678 2.6  5.789  -0.23411 +01.45";

        string row = "[  5] 38.0-39.0 sec  11.5 MBytes  96.4 Mbits/sec   0.294 ms   11/ 8208 (0.13%)";

        const std::sregex_iterator end;
        for (std::sregex_iterator iter(std::cbegin(str), std::cend(str), reg1); iter != end;++iter)
                std::cout << iter->str() << std::endl;

        for (std::sregex_iterator iter(std::cbegin(row), std::cend(row), reg); iter != end;++iter)
                std::cout << iter->str() << std::endl;

}

void test1(string str)
{
       
        //string str = "Hello 2018, Bye 2017";
        //string str = "[  5] 38.0-39.0 sec  11.5 MBytes  96.4 Mbits/sec   0.294 ms   11/ 8208 (0.13%)";
        smatch result;
        regex Bandwidth("-?(([0-9]\\d*\\.[1-9]\\d*)|(0)|(0\\.[1-9]\\d*)|([0-9]\\d*))\\sMbits");//(".+(\\d Mbits/sec).+(\\(\\d%\\))");        //
        //regex  Packageloss("\\(([0-9]+%)\\)");
        regex  Packageloss("\\(-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*)|([0-9]\\d*))\\%\\)");
        //regex Value("-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*))");
       
       
       
        //迭代器声明
        string::const_iterator iterStart = str.begin();
        string::const_iterator iterEnd = str.end();
        string temp,value;
        cout << "==============================" << endl;
        while (regex_search(iterStart, iterEnd, result, Bandwidth))
        {
                temp = result[0];
                cout << "==== bandwidth: " << result[1] << endl;
                iterStart = result[0].second;        //更新搜索起始位置,搜索剩下的字符串
        }
        cout << "----------------------------------" << endl;
        while (regex_search(iterStart, iterEnd, result, Packageloss))
        {
                temp = result[0];
                cout << "==== package loss: " << result[1] << endl;
                iterStart = result[0].second;        //更新搜索起始位置,搜索剩下的字符串
        }
        cout << "-------+++------------------------" << endl;
}


int main(void)
{
        test();
        int ret,fd,pid;
        //regex Bandwidth("\\s\\s([1-9,\\\\.]+)\\sMbits");
        regex Bandwidth(".+(\\d Mbits/sec).+(\\(\\d%\\))");
        cout << "\\s\\s([1-9,\\\\.]+)\\sMbits" << endl;
        //"MBytes  .* Mbits/sec"
        regex Packageloss("\\(([0-9]+%)\\)");
       
       
        ret = mkfifo("/var/fifo1",S_IRUSR | S_IWUSR);
        cout << "ret: " << ret << endl;

        pid = fork();
        if (pid > 0) {
                cout << "- parent -" << endl;
                fd = open("/var/fifo1",O_RDONLY,0);
                if(fd < 0){
                        cout << "open error!\n" ;
                        return -1;
                }
                char buf1[500];
                while(1) {
                        cout << "please waiting...\n";
                        ssize_t s = read(fd,buf1,sizeof(buf1)-1);
                        if(s > 0) {
                                buf1[s-1] = 0;
                                string row = buf1;//"[  5] 38.0-39.0 sec  11.5 MBytes  96.4 Mbits/sec   0.294 ms   11/ 8208 (0.13%)";//buf1;
                                cout << row << endl;
                                test1(row);
                               

                        } else if (s == 0) {
                                cout << "client quit,exit ..." << endl;
                                break;
                        }
                }
               
        } else if (pid == 0){
                cout << "- child -" << endl;
                fd = open("/var/fifo1",O_WRONLY,0);
                if(fd < 0){
                        cout << "open error!\n" ;
                        return -1;
                }
                char buf1[500];
                while(1) {
                        cout << "client\n";
                        fflush(stdout);
                ssize_t s = read(0,buf1,sizeof(buf1)-1);
                if(s > 0) {
                                buf1[s] = 0;
                                write(fd,buf1,strlen(buf1));
                }
                }
        } else {
                cout << "fork error!\n" ;
        }
       
                cout << "file is exit!\n" ;
                close(ret);
       

       
}

使用特权

评论回复
沙发
keer_zu|  楼主 | 2022-9-27 13:44 | 只看该作者
部分运行结果日志:

==============================
----------------------------------
-------+++------------------------
please waiting...
a123 Mbits
a123 Mbits
client
==============================
==== bandwidth: 123
----------------------------------
-------+++------------------------
please waiting...
456 Mbits
456 Mbits
client
==============================
==== bandwidth: 456
----------------------------------
-------+++------------------------
please waiting...
[  3] local 192.168.0.1 port 1200 connected with 192.168.0.2 port 58812 (peer 2.1.8)
==============================
----------------------------------
-------+++------------------------
please waiting...
[  3]  0.0-10.0 sec   114 MBytes  95.7 Mbits/sec   1.044 ms    1/81440 (0.0012%)
==============================
==== bandwidth: 95.7
----------------------------------
==== package loss: 0.0012
-------+++------------------------
please waiting...

使用特权

评论回复
板凳
keer_zu|  楼主 | 2022-9-27 13:54 | 只看该作者
监控另外一个程序日志的实现:

这里是iperf,一个网络带宽丢包率等测试工具。

# iperf2 -u -s -p 1200 > /var/fifo1

使用特权

评论回复
地板
keer_zu|  楼主 | 2022-9-27 14:02 | 只看该作者
另一台机器上,iperf客户端启动:

iperf-2.1.8-win.exe -c 192.168.0.1  -b1000M -t 100 -B 192.168.0.2 -p 1200 -u -i 1 -t 10

使用特权

评论回复
5
keer_zu|  楼主 | 2022-9-27 14:06 | 只看该作者
@21ic小管家 @21小跑堂
原创,请给个编辑推荐

使用特权

评论回复
6
keer_zu|  楼主 | 2022-9-27 18:18 | 只看该作者
增加读取文件每一行并且解析:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>  
#include <iostream>
#include<regex>
#include <fstream>



//int mkfifo( const char* path,
//            mode_t mode );

using namespace std;

#include <string>

void test()
{
        std::regex reg("-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*))\\sMbits");
        std::regex reg1("-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*))");

        std::string str = "这是中文示例abc 1234.2  a 匹配浮点数值XX5678 2.6  5.789  -0.23411 +01.45";

        string row = "[  5] 38.0-39.0 sec  11.5 MBytes  96.4 Mbits/sec   0.294 ms   11/ 8208 (0.13%)";

        const std::sregex_iterator end;
        for (std::sregex_iterator iter(std::cbegin(str), std::cend(str), reg1); iter != end;++iter)
                std::cout << iter->str() << std::endl;

        for (std::sregex_iterator iter(std::cbegin(row), std::cend(row), reg); iter != end;++iter)
                std::cout << iter->str() << std::endl;

}

void test1(string str)
{
       
        //string str = "Hello 2018, Bye 2017";
        //string str = "[  5] 38.0-39.0 sec  11.5 MBytes  96.4 Mbits/sec   0.294 ms   11/ 8208 (0.13%)";
        smatch result;
        regex Bandwidth("-?(([0-9]\\d*\\.[1-9]\\d*)|(0)|(0\\.[1-9]\\d*)|([0-9]\\d*))\\sMbits");//(".+(\\d Mbits/sec).+(\\(\\d%\\))");        //
        //regex  Packageloss("\\(([0-9]+%)\\)");
        regex  Packageloss("\\(-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*)|([0-9]\\d*))\\%\\)");
        //regex Value("-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*))");
       
       
       
        //迭代器声明
        string::const_iterator iterStart = str.begin();
        string::const_iterator iterEnd = str.end();
        string temp,value;
        cout << "==============================" << endl;
        while (regex_search(iterStart, iterEnd, result, Bandwidth))
        {
                temp = result[0];
                cout << "==== bandwidth: " << result[1] << endl;
                iterStart = result[0].second;        //更新搜索起始位置,搜索剩下的字符串
        }
        cout << "----------------------------------" << endl;
        while (regex_search(iterStart, iterEnd, result, Packageloss))
        {
                temp = result[0];
                cout << "==== package loss: " << result[1] << endl;
                iterStart = result[0].second;        //更新搜索起始位置,搜索剩下的字符串
        }
        cout << "-------+++------------------------" << endl;
}


int main(void)
{
        string line;
          
           //打开文件data.txt
        ifstream fin("ethernetTest.sh");
       
        string s;  
   

        test();
        int ret,fd,pid;
        //regex Bandwidth("\\s\\s([1-9,\\\\.]+)\\sMbits");
        regex Bandwidth(".+(\\d Mbits/sec).+(\\(\\d%\\))");
        cout << "\\s\\s([1-9,\\\\.]+)\\sMbits" << endl;
        //"MBytes  .* Mbits/sec"
        regex Packageloss("\\(([0-9]+%)\\)");
        regex filePath("/var/fifo\\d*");
        string fp = "iperf2 -u -s -p 1200 > /var/fifo01 &";
        string::const_iterator itStart;// = fp.begin();
        string::const_iterator itEnd;// = fp.end();
       
        cout << "==============================" << endl;
       
        while( getline(fin,s) ){       
                itStart = s.begin();
                itEnd = s.end();
                smatch result;
                if (regex_search(itStart, itEnd, result, filePath)) {
                        cout << "+++++ file path: " << result[0] << endl;
                } else {
                        cout << "--- no search ---" << endl;
                }
        }
       
        ret = mkfifo("/var/fifo1",S_IRUSR | S_IWUSR);
        cout << "ret: " << ret << endl;

        pid = fork();
        if (pid > 0) {
                cout << "- parent -" << endl;
                fd = open("/var/fifo1",O_RDONLY,0);
                if(fd < 0){
                        cout << "open error!\n" ;
                        return -1;
                }
                char buf1[500];
                while(1) {
                        cout << "please waiting...\n";
                        ssize_t s = read(fd,buf1,sizeof(buf1)-1);
                        if(s > 0) {
                                buf1[s-1] = 0;
                                string row = buf1;//"[  5] 38.0-39.0 sec  11.5 MBytes  96.4 Mbits/sec   0.294 ms   11/ 8208 (0.13%)";//buf1;
                                cout << row << endl;
                                test1(row);
                               

                        } else if (s == 0) {
                                cout << "client quit,exit ..." << endl;
                                break;
                        }
                }
               
        } else if (pid == 0){
                cout << "- child -" << endl;
                fd = open("/var/fifo1",O_WRONLY,0);
                if(fd < 0){
                        cout << "open error!\n" ;
                        return -1;
                }
                char buf1[500];
                while(1) {
                        cout << "client\n";
                        fflush(stdout);
                ssize_t s = read(0,buf1,sizeof(buf1)-1);
                if(s > 0) {
                                buf1[s] = 0;
                                write(fd,buf1,strlen(buf1));
                }
                }
        } else {
                cout << "fork error!\n" ;
        }
       
                cout << "file is exit!\n" ;
                close(ret);
       

       
}

使用特权

评论回复
7
keer_zu|  楼主 | 2022-9-28 09:31 | 只看该作者
在正则表达式里面先找出fifo文件名和路径,然后找出端口号:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>  
#include <iostream>
#include<regex>
#include <fstream>



//int mkfifo( const char* path,
//            mode_t mode );

using namespace std;

#include <string>

void test()
{
        std::regex reg("-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*))\\sMbits");
        std::regex reg1("-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*))");

        std::string str = "这是中文示例abc 1234.2  a 匹配浮点数值XX5678 2.6  5.789  -0.23411 +01.45";

        string row = "[  5] 38.0-39.0 sec  11.5 MBytes  96.4 Mbits/sec   0.294 ms   11/ 8208 (0.13%)";

        const std::sregex_iterator end;
        for (std::sregex_iterator iter(std::cbegin(str), std::cend(str), reg1); iter != end;++iter)
                std::cout << iter->str() << std::endl;

        for (std::sregex_iterator iter(std::cbegin(row), std::cend(row), reg); iter != end;++iter)
                std::cout << iter->str() << std::endl;

}

void test1(string str)
{
       
        //string str = "Hello 2018, Bye 2017";
        //string str = "[  5] 38.0-39.0 sec  11.5 MBytes  96.4 Mbits/sec   0.294 ms   11/ 8208 (0.13%)";
        smatch result;
        regex Bandwidth("-?(([0-9]\\d*\\.[1-9]\\d*)|(0)|(0\\.[1-9]\\d*)|([0-9]\\d*))\\sMbits");//(".+(\\d Mbits/sec).+(\\(\\d%\\))");        //
        //regex  Packageloss("\\(([0-9]+%)\\)");
        regex  Packageloss("\\(-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*)|([0-9]\\d*))\\%\\)");
        //regex Value("-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*))");
       
       
       
        //迭代器声明
        string::const_iterator iterStart = str.begin();
        string::const_iterator iterEnd = str.end();
        string temp,value;
        cout << "==============================" << endl;
        while (regex_search(iterStart, iterEnd, result, Bandwidth))
        {
                temp = result[0];
                cout << "==== bandwidth: " << result[1] << endl;
                iterStart = result[0].second;        //更新搜索起始位置,搜索剩下的字符串
        }
        cout << "----------------------------------" << endl;
        while (regex_search(iterStart, iterEnd, result, Packageloss))
        {
                temp = result[0];
                cout << "==== package loss: " << result[1] << endl;
                iterStart = result[0].second;        //更新搜索起始位置,搜索剩下的字符串
        }
        cout << "-------+++------------------------" << endl;
}


int main(void)
{
        string line;
          
           //打开文件data.txt
        ifstream fin("ethernetTest.sh");
       
        string s;  
   

        test();
        int ret,fd,pid;
        //regex Bandwidth("\\s\\s([1-9,\\\\.]+)\\sMbits");
        regex Bandwidth(".+(\\d Mbits/sec).+(\\(\\d%\\))");
        cout << "\\s\\s([1-9,\\\\.]+)\\sMbits" << endl;
        //"MBytes  .* Mbits/sec"
        regex Packageloss("\\(([0-9]+%)\\)");
        regex filePath("/var/fifo_([0-9]\\d*)");
       
        string::const_iterator itStart;// = fp.begin();
        string::const_iterator itEnd;// = fp.end();
       
        cout << "==============================" << endl;
       
        while( getline(fin,s) ){       
                itStart = s.begin();
                itEnd = s.end();
                smatch result;
                if (regex_search(itStart, itEnd, result, filePath)) {
                        cout << "+++++ file path: " << result[0] << " num: " << result[1] << endl;
                } else {
                        cout << "--- no search ---" << endl;
                }
        }
       
        ret = mkfifo("/var/fifo1",S_IRUSR | S_IWUSR);
        cout << "ret: " << ret << endl;

        pid = fork();
        if (pid > 0) {
                cout << "- parent -" << endl;
                fd = open("/var/fifo1",O_RDONLY,0);
                if(fd < 0){
                        cout << "open error!\n" ;
                        return -1;
                }
                char buf1[500];
                while(1) {
                        cout << "please waiting...\n";
                        ssize_t s = read(fd,buf1,sizeof(buf1)-1);
                        if(s > 0) {
                                buf1[s-1] = 0;
                                string row = buf1;//"[  5] 38.0-39.0 sec  11.5 MBytes  96.4 Mbits/sec   0.294 ms   11/ 8208 (0.13%)";//buf1;
                                cout << row << endl;
                                test1(row);
                               

                        } else if (s == 0) {
                                cout << "client quit,exit ..." << endl;
                                break;
                        }
                }
               
        } else if (pid == 0){
                cout << "- child -" << endl;
                fd = open("/var/fifo1",O_WRONLY,0);
                if(fd < 0){
                        cout << "open error!\n" ;
                        return -1;
                }
                char buf1[500];
                while(1) {
                        cout << "client\n";
                        fflush(stdout);
                ssize_t s = read(0,buf1,sizeof(buf1)-1);
                if(s > 0) {
                                buf1[s] = 0;
                                write(fd,buf1,strlen(buf1));
                }
                }
        } else {
                cout << "fork error!\n" ;
        }
       
                cout << "file is exit!\n" ;
                close(ret);
       

       
}



运行结果:

# ./fifo_test
1234.2
2.6
5.789
-0.23411
1.45
96.4 Mbits
\s\s([1-9,\\.]+)\sMbits
==============================
--- no search ---
--- no search ---
--- no search ---
--- no search ---
--- no search ---
+++++ file path: /var/fifo_1200 num: 1200
+++++ file path: /var/fifo_1201 num: 1201
+++++ file path: /var/fifo_1202 num: 1202
+++++ file path: /var/fifo_1203 num: 1203
+++++ file path: /var/fifo_1205 num: 1205
--- no search ---
+++++ file path: /var/fifo_1206 num: 1206
+++++ file path: /var/fifo_1207 num: 1207
+++++ file path: /var/fifo_1209 num: 1209
+++++ file path: /var/fifo_1210 num: 1210
--- no search ---
--- no search ---
--- no search ---
--- no search ---
--- no search ---
ret: -1
- parent -
- child -
please waiting...
client

使用特权

评论回复
8
keer_zu|  楼主 | 2022-10-9 09:40 | 只看该作者
封装。
头文件:
#ifndef __IPERF_COLLECTION_H__
#define __IPERF_COLLECTION_H__

#include <map>
#include <pthread.h>
#include "macros.h"

using namespace std;

typedef void ( * port_performance_calback_t ) ( void * data ) ;

template<typename T>
class Singleton{
public:
    static T& get_instance(){
        static T instance;
        return instance;
    }
       
    virtual ~Singleton(){
        std::cout<<"destructor called!"<<std::endl;
    }
       
    Singleton(const Singleton&)=delete;
    Singleton& operator =(const Singleton&)=delete;
       
protected:
    Singleton(){
        std::cout<<"constructor called!"<<std::endl;
    }

};



class IperfCollection:public       Singleton<IperfCollection> {
        friend class Singleton<IperfCollection>;
public:

        int Init(port_performance_calback_t cb);
       
private:

        int createFifo();
        int stringParsing(string str,int port);
        static void *iperfDataCollection(void *data);
        IperfCollection():_callback(NULL){}
        ~IperfCollection(){}
       
        pthread_t        _threadId;
        port_performance_calback_t _callback;
       
        map<int,string> _portFifo;
        map<int,int> _portFd;
};






#endif

使用特权

评论回复
9
keer_zu|  楼主 | 2022-10-9 09:41 | 只看该作者
.cpp文件:

#include <fstream>
#include <fcntl.h>  
#include <iostream>
#include <regex>
#include <string>
#include "common_log.h"
#include "IperfCollection.h"


using namespace std;



int IperfCollection::createFifo()
{
        ifstream fin("ethernetTest.sh");
        string::const_iterator itStart;
        string::const_iterator itEnd;
        string scriptLine;

        int ret;
        regex filePath("/var/fifo_([0-9]\\d*)");
       
        while( getline(fin,scriptLine) ){       
                itStart = scriptLine.begin();
                itEnd = scriptLine.end();
                smatch result;
                if (regex_search(itStart, itEnd, result, filePath)) {
                        string str_port = result[1];
                        string file = result[0];
                        int port = atoi(str_port.c_str());
                        SLOG_I("fifo file path: %s  port:%d\n",file.c_str(),port);
                        string filepath = result[0];
                        ret = mkfifo(filepath.c_str(),S_IRUSR | S_IWUSR);
                        SLOG_I("mkfifo return:%d\n",ret);
                        _portFifo[port] = filepath;
                } else {
                        SLOG_W("no fifo search!");
                }
        }
       
        return 0;
}


struct rtl9072_port_status
{
  uint32_t port ;
  uint32_t tx_speed ;
  uint32_t tx_pack_drop_rate ;
  uint32_t rx_speed ;
  uint32_t rx_pack_drop_rate ;
} ;

int IperfCollection::stringParsing(string str, int port)
{
        float bandwidth,loss;
        struct rtl9072_port_status status;
        smatch result;
        port_performance_calback_t call = (port_performance_calback_t)_callback;
       
        regex BandwidthMbits("-?(((([1-9]\\d*)|([0-9]\\d)|(0))\\.(([0-9]\\d*)|([0-9])\\d))|(0)|([0-9]\\d*))\\sMbits");
        regex BandwidthKbits("-?(((([1-9]\\d*)|([0-9]\\d)|(0))\\.(([0-9]\\d*)|([0-9])\\d))|(0)|([0-9]\\d*))\\sKbits");       
        regex BandwidthGbits("-?(((([1-9]\\d*)|([0-9]\\d)|(0))\\.(([0-9]\\d*)|([0-9])\\d))|(0)|([0-9]\\d*))\\sGbits");
       
        regex  Packageloss("\\(-?(([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*)|([0-9]\\d*))\\%\\)");

        string::const_iterator iterStart = str.begin();
        string::const_iterator iterEnd = str.end();
        string temp,value;

        if (regex_search(iterStart, iterEnd, result, BandwidthMbits))
        {
                temp = result[0];

                value = result[1];
                bandwidth = stof(value) * 1000;
                status.rx_speed = (uint32_t)bandwidth;
                SLOG_I("BandwidthMbits:%s\n",value.c_str());
        } else if (regex_search(iterStart, iterEnd, result, BandwidthKbits)) {
                temp = result[0];
                value = result[1];
                bandwidth = stof(value);
                status.rx_speed = (uint32_t)bandwidth;
                SLOG_I("bandwidthKbits:%s\n",value.c_str());
        } else if (regex_search(iterStart, iterEnd, result, BandwidthGbits)) {
                temp = result[0];
                value = result[1];
                bandwidth = stof(value) * 1000000;
                status.rx_speed = (uint32_t)bandwidth;
                SLOG_I("BandwidthGbits:%s\n",value.c_str());
        }
       
        if (regex_search(iterStart, iterEnd, result, Packageloss))
        {
                temp = result[0];
                value = result[1];
                loss = stof(value) * 100000;
                status.rx_pack_drop_rate = (uint32_t)loss;
                SLOG_I("package loss:%s\n",value.c_str());       
        }

        if(call != NULL)
                call(&status);

        return 0;
}




void * IperfCollection::iperfDataCollection(void *data)
{
        int ret,fd;
        IperfCollection *collection = (IperfCollection *)data;
        map<int,string>::iterator iter_pf;
        for(iter_pf = (collection->_portFifo).begin();iter_pf != (collection->_portFifo).end();iter_pf ++) {
                string file = iter_pf->second;
                int port = iter_pf->first;
                fd = open(file.c_str(),O_RDONLY | O_NONBLOCK,0);
                if(fd < 0){
                        SLOG_E("open error!\n") ;
                        return NULL;
                }

                collection->_portFd[port] = fd;
        }
       
        char buf1[500];
        while(1) {
                for(iter_pf = (collection->_portFifo).begin();iter_pf != (collection->_portFifo).end();iter_pf ++) {
                        string file = iter_pf->second;
                        int port = iter_pf->first;
                        ssize_t s = read(collection->_portFd[port],buf1,sizeof(buf1)-1);
                        if(s > 0) {
                                buf1[s-1] = 0;
                                string row = buf1;
                                cout << row << endl;
                                collection->stringParsing(row,port);
                        } else if (s == 0) {
                                SLOG_I("client(%d) quit,exit ...\n", port);
                                continue;
                        }
                }

                sleep(1);
        }
        close(ret);
        return NULL;
}



int IperfCollection::Init(port_performance_calback_t cb)
{
        int ret;
       
        ret = this->createFifo();
        if (ret != 0) {
                SLOG_E("createFifo error:%d\n", ret);
                return ret;
        }

        if(cb != NULL)
                _callback = cb;

        pthread_create(&_threadId, NULL, &iperfDataCollection ,this);
       
        return 0;
}





使用特权

评论回复
10
keer_zu|  楼主 | 2022-10-9 09:43 | 只看该作者
demo:

void callback(void *data)
{
        cout << "======== call back =====" << endl;
}


int main(void)
{
        IperfCollection &collection = IperfCollection::get_instance();
        //collection
        collection.Init(callback);

        IperfCollection *coll = &IperfCollection::get_instance();
        coll->Init(callback);

        auto re = system("./ethernetTest.sh");
    cout << "re = " << re << endl;

        while(1) {
                sleep(10);
                //return 0;
        }
}

使用特权

评论回复
11
keer_zu|  楼主 | 2022-10-9 09:44 | 只看该作者
ethernetTest.sh:

#!/bin/sh

# FIFO files are named as follows: /var/fifo_XXXX,XXXX is the port number to be tested

#100base
iperf2 -u -s -p 1200 > /var/fifo_1200 &
iperf2 -u -s -p 1201 > /var/fifo_1201 &
iperf2 -u -s -p 1202 > /var/fifo_1202 &
iperf2 -u -s -p 1203 > /var/fifo_1203 &
iperf2 -u -s -p 1205 > /var/fifo_1205 &
#1000base
iperf2 -u -s -p 1206 > /var/fifo_1206 &
iperf2 -u -s -p 1207 > /var/fifo_1207 &
iperf2 -u -s -p 1209 > /var/fifo_1209 &
iperf2 -u -s -p 1210 > /var/fifo_1210 &
#iperf2 -u -c 192.168.1.9 -p 1208 -B 192.168.1.12 -b 100m -t 60 -i 1

#SocketTest &

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1350

主题

12427

帖子

53

粉丝