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

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

Ubuntu下的C语言编程

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

#include
#include
#include
#include
#include
#include
#include
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

你可能感兴趣的:(socket编程,socket,TCP端口有扫描)