问题描述:
校验某个端口是否被使用(80端口是否被使用):
1、获取本机监听的地址列表中,协议类型为tcp与tcp6的端口;
(sudo netstat -nl | grep tcp | awk '{print $4}' | awk '{split($0,a,":");print a[2]a[4]}')
2、将获取到的列表中的值,与要被对比的监听的值(例如80值)向比较。
代码实现:
#include <stdio.h>
#include <string.h>
#define MAX_BUF 1024*2*2
#define CHECK 1
#define SUCCESS 0
#define PARAMETER_VALUE_ERROR 101 //参数值错误,不符合要求,如有边界值或选项参数
/******************************************************************
简述:获取本机的监听端口列表
参数:void
返回值:监听的端口列表,并以逗号分割,失败返回NULL
备注:
*******************************************************************/
static int _authservice_Check_port(char *pcPort)
{
int i = 0;
FILE *pf = NULL;
char szListen[MAX_BUF] = {0};
/* 使用popen获取本机地址 */
pf = popen("sudo netstat -nl | grep tcp | awk '{print $4}' | awk '{split($0,a,\":\");print a[2]a[4]}'", "r");
if(NULL == pf)
{
return CHECK;
}
while(NULL != fgets(szListen, sizeof(szListen), pf))
{
szListen[strlen(szListen) - 1] = '\0';
printf("##%s##\n", szListen);
if(!strncmp(pcPort, szListen, sizeof(pcPort)))
{
return PARAMETER_VALUE_ERROR;
}
}
return SUCCESS;
}
int main()
{
//端口的校验,0~65535 且不能有使用过的端口
if(SUCCESS != (_authservice_Check_port("80")))
{
return PARAMETER_VALUE_ERROR;
}else{
printf("Has not been used!\n"); //没有被使用
}
return SUCCESS;
}
结果显示:
[root@J01051386 test]# gcc link1.c
[root@J01051386 test]# ./a.out
##111##
##48145##
##22##
##631##
##25##
##902##
##111##
##22##
##631##
##25##
##43260##
##902##
Has not been used!
其他:
链表实现的方式见:
netstat获取本机监听的地址列表 —— *链表实现*(sudo netstat -nl | grep -w tcp | awk '{print $4}')
注:(链表实现中,只能匹配tcp不可匹配tcp6的端口)