Linux Socket端口扫描器

    选择打赏方式

Name:         Socket Port Scanner For Linux
Language:    C
OS:             Armhf,AArch64,X64,X86
Complie:     gcc s.c -lpthread -o s
Example:     ./ ip.txt 3306
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/select.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <errno.h>
#include <netdb.h>
#include <pthread.h>
int conn_nonb(char *ip,int port,int nsec);
pthread_mutex_t mut;

int **res;

struct argument
{
    char *ip;
    int s_port;
    int e_port;
    int i;
};

int main(int argc, const char * argv[])
{
    
    // insert code here...
    if (argc < 2) {
        printf("Example:./s ip.txt 3306\n");
        printf("ip.txt Example 172.16.0.0 172.24.255.255\n");
        return 0;
    }
    //int fd[65535];
    char *sip = argv[1];
    int s_port = atoi(argv[2]);
    int open[65535];
    int count = 0;
        //使用单线程
/*        for (int i = s_port; i <= e_port; i++) {
            printf("Port Scanner%d \n",i);
            int r = -1;
            if ((r=conn_nonb(ip, i, 100)) == 0) {
                open[count] = i;
                count++;
            }
        }
*/
int i,ii,iii,i1,i2,ch;
int n=0;
char w3[36],buf[60]={0};
FILE *fp;
FILE *fp1;
// 检测行数
fp=fopen(sip,"r");
while((ch = fgetc(fp)) != EOF) 
{if(ch == '\n'){n++;}}  
fclose(fp);
//逐行读取
fp=fopen(sip,"r+");
for(i=1;i<=n;i++){
fgets(w3,100,fp);
int da0,da1,da2,da3,da4,da5,da6,da7;
sscanf(w3,"%d.%d.%d.%d %d.%d.%d.%d",&da0,&da1,&da2,&da3,&da4,&da5,&da6,&da7);
for(i2 = da0; i2 <= da4; i2++){
	for(i1 = da1; i1 <= da5; i1++){
		for(ii = da2; ii <= da6; ii++){
			if (ii==da2&&ii!=da6&&da2!=da6){
				for(iii = da3; iii <= 255; iii++)
				{
                sprintf(buf,"%d.%d.%d.%d",i2,i1,ii,iii);
                conn_nonb(buf, s_port, 100);
				}
			}
			else if(da2<ii<da6&&da2!=da6&&ii!=da6){
				for(iii = 0; iii <= 255; iii++)
				{
                sprintf(buf,"%d.%d.%d.%d",i2,i1,ii,iii);
                conn_nonb(buf, s_port, 100);
				} 
			}
			else if (ii==da6&&da2!=da6){
				for(iii = 0; iii <= da7; iii++)
				{
                sprintf(buf,"%d.%d.%d.%d",i2,i1,ii,iii);
                conn_nonb(buf, s_port, 100);
				}   
			}
			else if (ii==da6&&da2==da6){
				for(iii = da3; iii <= da7; iii++)
				{
                sprintf(buf,"%d.%d.%d.%d",i2,i1,ii,iii);
                conn_nonb(buf, s_port, 100);
				}   
			}        
		}}}
//for结束
}
fclose(fp); 
    return 0;
}

int conn_nonb(char *ip,int port,int nsec)
{
    int flags, n, error;
    fd_set rset,wset;
    struct timeval tval;
    
    FD_ZERO(&wset);
    FD_ZERO(&rset);
    tval.tv_sec = 1;
    tval.tv_usec = 0;
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    flags = fcntl(sockfd, F_GETFL, 0);
    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
    
    struct sockaddr_in address;
    bzero(&address, sizeof(address));
    address.sin_family = AF_INET;
    inet_pton(AF_INET, ip, &address.sin_addr);
    address.sin_port = htons(port);
    
    error = 0;
    if((n=connect(sockfd,(struct sockaddr *)&address,sizeof(address)))<0){
        if(errno!=EINPROGRESS)
        {
            printf("Connecting 1 error!\n");
            return -1;
        }
        else if(n==0)
        { 
            printf("Connecting 1 success! \n");
            return 0;
        }
    }
    FD_SET(sockfd,&rset);
    wset=rset;
    int rst=select(sockfd+1, &rset,&wset,NULL,&tval);
    
    switch (rst) {
        case -1:
            perror("Select error"); exit(-1);
        case 0:
            close(sockfd);
            printf("Timed Out!\n");
            break;
        default:
            if (FD_ISSET(sockfd,&rset)||FD_ISSET(sockfd,&wset)) {
                int error;
                socklen_t len = sizeof (error);
                if(getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,&len) < 0)
                {
                    printf ("getsockopt fail,connected fail\n");
                    return -1;
                }
                if(error==0)
                {
                    printf ("%s\t%d open\n",ip,port);
                    return 0;
                }
            }
            close(sockfd);
    }
    return -1;
}
版权声明:若无特殊注明,本文皆为《 CM部落 》原创,转载请保留文章出处。
本文链接:Linux Socket端口扫描器 https://itkz.cn/note/94.html
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗 胜利 不高兴 阴险 乖 酷 滑稽

评论信息框

吃奶的力气提交吐槽中...


既然没有吐槽,那就赶紧抢沙发吧!