您的位置:首页 > 理论基础 > 计算机网络

基于socket编程的的TCP端口扫描程序

2019-09-24 09:35 1131 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_44151143/article/details/101265836

基于socket编程的的TCP端口扫描程序

Ubuntu下的C语言编程

用户设定扫描目的的地址;并设定扫描端口的范围;
先通过gcc编译 gcc scanip.c -o scanip
然后运行./scanip 127.0.0.1 1 65535(可修改为自己想要扫描的IP和端口范围)

#include<stdlib.h>
#include<stdio.h>
#include<sys/socket.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
struct servent{
char* s_name;
char** s_aliases;
int s_port;
char* s_proto;
};

void print_usage(char * cmd)
{
fprintf(stderr," %s usage:\n",cmd);
fprintf(stderr,"%sIP_Addr[port]\n",cmd);
}
int scanport(int sockfd,struct sockaddr_in scanip,int port,char** arg){
if(-1==(sockfd=socket(AF_INET,SOCK_STREAM,0))){
perror("can not create socket\n");
exit(1);
}
memset(&scanip,0,sizeof(struct sockaddr_in))
scanip.sin_family = AF_INET;
scanip.sin_addr.s_addr =inet_addr(arg[1]);
scanip.sin_port = htons(port);
int ret =connect(sockfd,(struct sockaddr*)&scanip,sizeof(struct sockaddr));
close(sockfd);
return ret;
}
int main(int argc,char** argv)
{
int sockfd;
struct servent* sp;
int start_port=atoi(argv[2]);
int end_port=atoi(argv[3]);
struct sockaddr_in scanip;
if (4!=argc)
{
print_usage(argv[0]);
exit(1);
}
for(start_port;start_port<=end_port;start_port++){
if(!scanport(sockfd,scanip,start_port,argv)){
if (-1==(sockfd=socket(AF_INET,SOCK_STREAM,0)))
{
perror("can not create socket\n");
exit(1);
}
connect(sockfd,(struct sockaddr*)&scanip,sizeof(struct sockaddr));		sp=getservbyport(htons(start_port),"tcp";
if (NULL!=sp){
printf("%d,%s\n",start_port,sp->s_name);
}
else{
printf("%d unknow\n",start_port);
}
close(sockfd);
}
}
exit(0);

}

可以通过nmap进行验证,结果一致
nmap的安装:opt install nmap

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: