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命令的功能是顯示網絡連接、路由表和網絡接口信息,可以讓用戶得知目前都有哪些網絡連接正在運作。
?
?代碼實現:
#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 0typedef 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;}}?結果顯示:
[root@J01051386 test]# gcc link.c [root@J01051386 test]# ./a.out 111 902 25 631 22 48145其他:
只能匹配tcp不可匹配tcp6的端口。
僅僅用命令獲取本機監聽的端口列表,包括tcp與tcp6。即不適用鏈表實現。見
netstat獲取本機監聽的地址列表 —— *awk與splite命令實現*(sudo netstat -nl | grep tcp……)
總結
以上是生活随笔為你收集整理的netstat获取本机监听的地址列表 —— *链表实现*(sudo netstat -nl | grep -w tcp | awk '{print $4}')的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写文件 —— 将内容按照指定格式写入配置
- 下一篇: netstat获取本机监听的地址列表 —