1. 程式人生 > >netstat獲取本機監聽的地址列表 —— *連結串列實現*(sudo netstat -nl | grep -w tcp | awk '{print $4}')

netstat獲取本機監聽的地址列表 —— *連結串列實現*(sudo netstat -nl | grep -w tcp | awk '{print $4}')

問題描述:

獲取本機監聽的地址列表中,協議型別為tcp的埠。(sudo netstat -nl | grep -w tcp)
 

知識填充:

在linux一般使用netstat 來檢視系統埠使用情況步。


      netstat命令是一個監控TCP/IP網路的非常有用的工具,它可以顯示路由表、實際的網路連線以及每一個網路介面裝置的


      netstat命令的功能是顯示網路連線、路由表和網路介面資訊,可以讓使用者得知目前都有哪些網路連線正在運作。
 

 該命令的一般格式為:
 
 
      netstat [選項]
 
 
      命令中各選項的含義如下:
 
 
      -a 顯示所有socket,包括正在監聽的。
 
 
      -c 每隔1秒就重新顯示一遍,直到使用者中斷它。
 
 
      -i 顯示所有網路介面的資訊,格式同“ifconfig -e”。
 
 
      -n 以網路IP地址代替名稱,顯示出網路連線情形。
 
 
      -r 顯示核心路由表,格式同“route -e”。
 
 
      -t 顯示TCP協議的連線情況。
 
 
      -u 顯示UDP協議的連線情況。
 
 
      -v 顯示正在進行的工作。
一些使用例項:
1. netstat -an | grep LISTEN
      0.0.0.0的就是每個IP都有的服務,寫明哪個IP的就是繫結那個IP的服務。
 
2. netstat -tln
      用來檢視linux的埠使用情況
 
3. /etc/init.d/vsftp start
      是用來啟動ftp埠~!
 
4. netstat
      檢視已經連線的服務埠(ESTABLISHED)
 
5. netstat -a
      檢視所有的服務埠(LISTEN,ESTABLISHED)
 
6. sudo netstat -ap
      檢視所有的服務埠並顯示對應的服務程式名
 
7.檢視某個埠的連線數
   netstat -nat|grep -i "80"|wc -l

 程式碼實現:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define PARAMETER_VALUE_ERROR 101
#define IPV4_MAX_SIZE           16
#define PORT_MAX_SIZE           5
#define SUCCESS	0
 
typedef struct st_waf_proxy_Listen
{
	char szListenIP[IPV4_MAX_SIZE + 1];
	char szListenPort[PORT_MAX_SIZE + 1];
	struct st_waf_proxy_Listen *pstNext;
}WAF_PROXY_LISTEN_LIST_S;
 
/******************************************************************
  簡述:   銷燬host連結串列
  引數:WAF_PROXY_LISTEN_S *pstListen     單鏈表表頭
  返回值:void
  備註:
 *******************************************************************/
static void _wafproxy_delete_ListenList(WAF_PROXY_LISTEN_LIST_S *pstListen)
{
	WAF_PROXY_LISTEN_LIST_S *pstTmp = NULL;
 
	while(NULL != pstListen)
	{
		pstTmp = pstListen;
		pstListen = pstListen->pstNext;
		free(pstTmp);
	}
 
	return ;
}
 
 
/******************************************************************
  簡述:按格式解析獲取的監聽列表資料
  引數:void
  返回值:成功返回SUCCESS,失敗返回PARAMETER_VALUE_ERROR
  備註:待解析字串的形式為 0.0.0.0:22\n
 *******************************************************************/
static int _wafproxy_fmt_ListenList(const char *pcData, WAF_PROXY_LISTEN_LIST_S *pstListen)
{
	int i = 0;
	int iStrLen = 0;
 
	iStrLen = strlen(pcData);
 
	for(i = 0; i < iStrLen; i++)
	{
		if(':' == pcData[i])
		{
			/* 跳過“:”取到port值 */
			strncpy(pstListen->szListenPort, &pcData[i + 1], iStrLen - (i + 1) - 1);
			break;
		}
 
		pstListen->szListenIP[i] = pcData[i];
	}
 
	return SUCCESS;
}
 
/******************************************************************
  簡述:獲取本機的監聽地址列表
  引數:void
  返回值:成功返回資料鏈表的地址,失敗返回NULL
  備註:
 *******************************************************************/
static WAF_PROXY_LISTEN_LIST_S *_wafproxy_Get_ListenList(void)
{
	int i = 0;    
	FILE *pf = NULL;
	char szListen[IPV4_MAX_SIZE + 1 + PORT_MAX_SIZE + 1] = {0};
	WAF_PROXY_LISTEN_LIST_S *pstTmp       = NULL;
	WAF_PROXY_LISTEN_LIST_S *pstListenList = NULL;
 
	/* 使用popen獲取本機地址 */
	pf = popen("sudo netstat -nl | grep -w tcp | awk '{print $4}'", "r");
	if(NULL == pf)
	{
		return NULL;
	}
 
 
	while(NULL != fgets(szListen, sizeof(szListen), pf))
	{
		pstTmp = malloc(sizeof(*pstTmp));
		if(NULL == pstTmp)
		{
			pclose(pf);
			_wafproxy_delete_ListenList(pstListenList);
			return NULL;
		}
 
		memset(pstTmp, 0 , sizeof(*pstTmp));
		_wafproxy_fmt_ListenList(szListen, pstTmp);
 
		if(NULL  == pstListenList)
		{
			pstListenList = pstTmp;
		}
		else
		{
			pstTmp->pstNext = pstListenList->pstNext;
			pstListenList->pstNext = pstTmp;
		}
	}
 
	pclose(pf);
	return pstListenList; 
}
int main()
{   
	WAF_PROXY_LISTEN_LIST_S *pstListen = NULL;
	WAF_PROXY_LISTEN_LIST_S *pstTmp    = NULL;
	/* 獲取本機的監聽列表 */
	pstListen = _wafproxy_Get_ListenList();
	if(NULL  == pstListen)
	{
		return PARAMETER_VALUE_ERROR;
	}
 
	pstTmp = pstListen;
 
	/* 檢查與本機的監聽列表是否有衝突 */
	while(NULL != pstTmp)
	{
		printf("%s\n", pstTmp->szListenPort);
		pstTmp = pstTmp->pstNext;
	}
 
}

 結果顯示:

[[email protected] test]# gcc link.c
[[email protected] test]# ./a.out 
111
902
25
631
22
48145

其他:

只能匹配tcp不可匹配tcp6的埠。

僅僅用命令獲取本機監聽的埠列表,包括tcp與tcp6。即不適用連結串列實現。見

相關推薦

netstat獲取地址列表 —— *連結串列實現*sudo netstat -nl | grep -w tcp | awk '{print $4}'

問題描述: 獲取本機監聽的地址列表中,協議型別為tcp的埠。(sudo netstat -nl | grep -w tcp)   知識填充: 在linux一般使用netstat 來檢視系統埠使用情況步。       netstat命令是一個監控TCP/IP網路的非常

Linux雲主機獲取公網IP地址

forever linux ip地址 主機 因為公司的雲主機使用ifconfig和ip add命令都只能看到內網IP地址,而腳本裏面又需要獲取公網IP地址進行一些動作;# ip ad 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc

linux 獲取MAC/IP地址的方法

linunx 編程 mac 地址功能:查詢本機IP/MAC地址,過濾掉127.0.0.1 loop-back 地址適用:linux, ubuntu 16.04 調試通過#include <stdlib.h>#include <stdio.h>#include <unistd.h&

獲取的ip地址排除虛擬,藍牙等ip

運行 exception play pla 過濾 contains network localhost static 項目中遇到了要獲取本地ip的需求,網上查找資料遇到很多坑,很多Java獲取本機ip地址的方法要麽是根本獲取不到,要麽是獲取的有問題。 網上常見的方法如下 I

使用Linux curl命令獲取公網IP地址

使用Linux curl命令獲取本機公共IP地址   在本教程中,我們將學習如何使用Linux curl命令查詢計算機的公共IP地址。 通常,如果我們想要找到我們使用的公共IP地址,我們會去谷歌並搜尋“我的IP地址是什麼”。但是如果使用Linux,則可以使用curl命令從命令列

C# 獲取的IP地址

控制檯命令程式:       string name = Dns.GetHostName();             IPAddress[] ipadrlist = Dns.GetHostAddresses(name);             foreach (IP

Android獲取藍芽地址

從Android6.0開始,通過BluetoothAdapter.getDefaultAdapter().getAddress()獲取的地址是一個固定值02:00:00:00:00:00,部分從低版本

cocos2dx獲取全部ip地址。。。

使用的是raknet中獲取網絡卡的方式,支援linux,ios,安卓系統。未支援win。 #if defined(ANDROID) void UdpSocket::getHostIpByString( char ipList[ MAXIMUM_NUMBER_OF_INT

Qt 獲取的IP地址、Mac地址

獲取IP地址 QString getHostIpAddress() { QString strIpAddress; QList<QHostAddress> ipAddres

Python獲取所有IP地址

眾所周知,Python標準庫socket中有可以獲取本機IPV4地址的方法,下面是網上非常常見的一種用法: >>> import socket >>> hostname = socket.gethostname() >>&g

Java獲取的ip地址

說到獲取ip地址,有人可能會想到,直接用InetAddress.getLocalHost().getHostAddress()。實際上這個是不對的,因為一臺機器上可能有多個網路介面(一般指網絡卡或者虛擬網絡卡),因此也就有多個ip地址,所以我們需要列出所有的網路介面及其對應

用java程式碼如何獲取的IP地址和主機名

InetAddress localhost = InetAddress.getLocalHost();  System.out.println ("localhost: "+localhost.get

獲取的公網IP和內網IPJAVA原始碼

public class Test { public static void main(String[] args) { try { String ip1 = getMyIP(); System.out.println("myIP:" + ip1);

使用sed獲取正在的埠

今天依舊還是被SolrCloud給折磨著,Flume和Solr的表配置已經配置完畢,就是上傳不到zookeeper,一直顯示zookeeper超時連線,但是所有的配置已經按照文件上的寫好,為嘛不行呢?可是眼尖的我發現zookeeper的埠是5181,我記得預設的是2181,難道是為了安全配置成其他的了?但是我

c#中如何獲取MAC地址、IP地址、硬盤ID、CPU序列號等系統信息

finall ipaddress reac 地址 computer mod urn aca rop public class Computer { public static string CpuID; //1.cpu序列號 pub

獲取IP地址的小腳

ash class p地址 nbsp 地址 int done 獲取本機 onf 獲取本機私網地址(1個) 1 #!/bin/bash 2 # Author : standby 3 # Date : 2017-05-18 4 # D

python-獲取mac地址

names iyu ddr repr pri int .get variant pac 1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 ############################ 4 #File N

js獲取的網絡IP地址

p地址 tput ack javascrip var function tel back element JavaScript是一門腳本語言,是不能操作文件,讀取本地信息的,所以想要獲取IP,還需要借助後端技術。方法如下: //獲取本機的網絡ip地址 function j

unity 獲取ip地址

ipa mil work get hostname [] 本機 取ip gethost IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName()); //Dns.GetHostName()獲取本機名Dns.GetH

獲取IP地址

down pos -m 兩個 div mar inter 獲取本機ip地址 work 問題描述 一臺電腦有IPV4地址和IPV6地址,目前使用的基本是IPV4地址, 有些情況還有多個網卡,有線的、無線的、還有vmare虛擬的兩個網卡。 獲取所有的IP地址 //獲取本機IP