文档章节

linux(RedHat)从/proc/net/tcp 中读取tcp连接信息

北风其凉
 北风其凉
发布于 2014/08/26 22:58
字数 617
阅读 620
收藏 0

本段代码编译环境G++

在linux中,输入命令“netstat -at”可以查看tcp连接状况。用C++程序读取这些信息,可以通过读取文件“/proc/net/tcp”实现。

/proc/net/tcp内容如下:

上面代码取的是local_address、rem_address、st三列,分别代表本地地址和端口号、远端地址和端口号和连接状态。其中local_address和rem_address两列中每个数字都是一个16进制数,前面八个数,两两构成一个十六进制数,从左到右分别代表IP地址的第四段、第三段、第二段、第一段,冒号后面的四位代表一个16进制数即端口号

程序代码为:

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<sstream>

using namespace std;

//struct: Property of a tcp connection
struct ConnectionProperty
{
    string local_addr;
    string remote_addr;
    string state;
};

//Change hexadecimal number to decimal number
int HexToInt(char h)
{
    if(h >= '0' && h <= '9')
    {
        return h - '0';
    }
    else if(h >= 'A' && h <= 'F')
    {
        return h - 'A' + 10;
    }
    else
    {
        cerr << "Error: Illegal Hex Number!" << endl;
        return -1;
    }
}

//Get Ip address and port number from string XXXXXXXX:XXXX
string GetIpAddress(char* str)
{
    int a, b, c, d, e;
    
    a = HexToInt(str[0]) * 16 + HexToInt(str[1]);
    b = HexToInt(str[2]) * 16 + HexToInt(str[3]);
    c = HexToInt(str[4]) * 16 + HexToInt(str[5]);
    d = HexToInt(str[6]) * 16 + HexToInt(str[7]);
    e = HexToInt(str[9]) * 16 * 16 * 16 +
        HexToInt(str[10]) * 16 * 16 +
        HexToInt(str[11]) * 16 +
        HexToInt(str[12]);

    //change int to string
    string sa, sb, sc, sd, se;
    ostringstream oss; 
    oss << a;
    sa = oss.str(); 
    oss.str(""); //clear the content in oss
    oss << b;
    sb = oss.str();
    oss.str("");
    oss << c;
    sc = oss.str();
    oss.str("");
    oss << d;
    sd = oss.str();
    oss.str("");
    oss << e;
    se = oss.str();
    oss.str("");

    //return by order: d.c.b.a:e
    return sd + '.' + sc + '.' + sb + '.' + sa + ':' + se;
}

//Get tcp connection state
string GetConnectionState(char* str)
{

    if(str[0] == '0' && str[1] == '0') return "ERROR_STATUS";
    if(str[0] == '0' && str[1] == '1') return "TCP_ESTABLISHED";
    if(str[0] == '0' && str[1] == '2') return "TCP_SYN_SENT";
    if(str[0] == '0' && str[1] == '3') return "TCP_SYN_RECV";
    if(str[0] == '0' && str[1] == '4') return "TCP_FIN_WAIT1";
    if(str[0] == '0' && str[1] == '5') return "TCP_FIN_WAIT2";
    if(str[0] == '0' && str[1] == '6') return "TCP_TIME_WAIT";
    if(str[0] == '0' && str[1] == '7') return "TCP_CLOSE";
    if(str[0] == '0' && str[1] == '8') return "TCP_CLOSE_WAIT";
    if(str[0] == '0' && str[1] == '9') return "TCP_LAST_ACK";
    if(str[0] == '0' && str[1] == 'A') return "TCP_LISTEN";
    if(str[0] == '0' && str[1] == 'B') return "TCP_CLOSING";
    return "UNKNOWN_STATE";
}

int main()
{
    //read from file /proc/net/tcp
    ifstream infile("/proc/net/tcp", ios :: in);
    if(!infile)
    {
        cerr << "open error!" << endl;
        exit(1);
    }

    string s;
    char s_local_addr[20], s_remote_addr[20], s_state[20];
    getline(infile, s); //title: every column's name
    while(getline(infile, s))
    {    
        sscanf(s.c_str(), "%*s%s%s%s", s_local_addr, s_remote_addr, s_state);
        printf("%s\t%s\t%s\n", s_local_addr, s_remote_addr, s_state);

        string ip_local = GetIpAddress(s_local_addr);
        string ip_remote = GetIpAddress(s_remote_addr);
        string conn_state = GetConnectionState(s_state);

        cout << ip_local << "\t" << ip_remote << "\t" << conn_state << endl;
    }

    return 0;
}

程序运行结果为

可以看到,程序读取到的值和netstat是一样的

 

© 著作权归作者所有

北风其凉

北风其凉

粉丝 120
博文 498
码字总数 463522
作品 4
朝阳
程序员
私信 提问
Rsh/Tar快速克隆正在运行的Linux服务器

一 概述 本文目的在于快速克隆另一架正在运行的Linux服务器的全部内容,之后更改相应的配置文件,即可快速设置另一台完全相同配置的服务器 二 环境 本文使用最新的Redhat Linux 7.1 CDROM 第...

JavaGG
2009/05/07
336
0
RHCE 系列(二):如何进行包过滤、网络地址转换和设置内核运行时参数

正如第一部分(“设置静态网络路由”)提到的,在这篇文章(RHCE 系列第二部分),我们首先介绍红帽企业版 Linux 7(RHEL)中包过滤和网络地址转换(NAT)的原理,然后再介绍在某些条件发生变...

酱醋茶丶
2015/11/03
20
0
vmware的vmnet-感官和视觉上的效果

debian上启动一台系统为redhat的vmware虚拟机(版本为5.5.1),redhat有三块网卡:eth0,eth1,eth2,分别设置为bridge,nat,host-only模式,在物理机器debian上的/proc中可以看到网络连接情况...

晨曦之光
2012/04/10
253
0
Linux内核TCP协议多个SACK功能拒绝服务漏洞分析

作者: 启明星辰ADLab 公众号: https://mp.weixin.qq.com/s/cVZvgd5xvj4ljchlwDSDYQ 一、漏洞背景 2019年6月18日,Redhat发布安全公告,Linux内核TCP/IP协议栈存在3个安全漏洞(CVE-2019-11...

启明星辰ADLab
06/25
0
0
Admin(一)——Linux简介与简单命令

一、RHEL 与CentOS的区别 RHEL是红帽公司提供的商业版Linux系统,若要获取DVD镜像、安全更新等技术服务支持,一般需要付费订阅;不过构成RHEL系统的各种软件包都是基于GPL开源协议免费发布的...

神奇的小哈
2018/05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis + Ehcache 二级缓存实例

二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕...

xiaolyuh
9分钟前
3
0
Spring源码学习(二)哎呦,按菜谱做菜与AbstractAutowireCapableBeanFactory.createBean流程差不多

记得跟老婆谈恋爱时,有一天心血来潮给老婆做饭,按照菜谱一步一步的做,结果差点把厨房烧了!!! 这事至今老婆还记得。 入口 上一篇说了,AbstractBeanFactory.getBean的主流程 ,今天来说下...

温安适
11分钟前
31
0
前端UI攻城狮 你们该抛弃jQuery了

你不再需要jQuery! Web工程师太依赖jQuery了,某种意义上说jQuery已经成了JavaScript的同义词。但是我们真的需要他么?或许我们应该反思一下什么时候才真的需要jQuery。 对我个人而言开始使...

前端老手
12分钟前
3
0
六、Java设计模式之工厂方法

工厂方法定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 类型:创建型 工厂方法-使用场景: 创建对象需要大量重复的代码 ...

东风破2019
54分钟前
5
0
win服务器管理遇到的一系列问题记录

有些小伙伴在使用iis7远程桌面管理工具的时候总是会遇到一系列的问题,下面就是为大家介绍一下服务器日常管理过程中出现的问题及我的解决办法和心得。希望能帮到大家。   拒绝服务器重新启...

1717197346
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部