从入门到入土:基于C语言采用SOCKET套接字实现TCP公开扫描程序&Web服务器扫描程序|代码展示

此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出。欢迎各位前来交流。(部分材料来源网络,若有侵权,立即删除)
本人博客所有文章纯属学习之用,不涉及商业利益。不合适引用,自当删除!
若被用于非法行为,与我本人无关

代码

服务端

#include<stdlib.h>
#include<stdio.h>
#include<sys/socket.h>
#include<netdb.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>

#define PORT 8900

int main(int argc,char** argv)
{
	struct sockaddr_in server;
	struct sockaddr_in client;
	int len;
	int port;
	int listend;
	int connectd;
	int sendnum;
	int opt;
	int recvnum;
	char send_buf[2048];
	char recv_buf[2048];

      //if (2==argc)

	port= PORT;
	memset(send_buf,0,2048);
	memset(recv_buf,0,2048);
	
      opt = SO_REUSEADDR;
      

      if (-1==(listend=socket(AF_INET,SOCK_STREAM,0)))
      {
	 perror("create listen socket error\n");
	 exit(1);
      }
      setsockopt(listend,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

      #ifdef DEBUG
	printf("the listen id is %d\n",listend);
      #endif

     memset(&server,0,sizeof(struct sockaddr_in));
     server.sin_family = AF_INET;
     server.sin_addr.s_addr = htonl(INADDR_ANY);
     server.sin_port = htons(port);

     if (-1==bind(listend,(struct sockaddr *)&server,sizeof(struct sockaddr)))
     {
	perror("bind error\n");
	exit(1);

     }

    if (-1==listen(listend,5))
    {
	perror("listen error\n");
	exit(1);
    }

    while (1)
    {
    

        if (-1==(connectd=accept(listend,(struct sockaddr*)&client,&len)))

    	{
		perror("create connect socket error\n");
		continue;
    	}

   	#ifdef DEBUG
		printf("the connect id is %d",connect);
		printf("the client ip addr is %s",inet_ntoa(client.sin_addr));
   	#endif
	
	sendnum = sprintf(send_buf,"hello,the guest from %s\n",inet_ntoa(client.sin_addr));
       if ( 0 >send(connectd,send_buf,sendnum,0))
	{
		perror("send error\n");
		close(connectd);
		continue;
	}
	
   	#ifdef DEBUG
		printf("the send num is %d",sendnum);
		printf("the client ip addr is %s",inet_ntoa(client.sin_addr));
   	#endif

        if (0>(recvnum = recv(connectd,recv_buf,sizeof(recv_buf),0)))
	{
		perror("recv error\n");
		close(connectd);
		continue;
	}
	recv_buf[recvnum]='\0';

	printf ("the message from the client is: %s\n",recv_buf);

	if (0==strcmp(recv_buf,"quit"))
        {
		perror("the client break the server process\n");
		close(connectd);
		break;
	}

	sendnum = sprintf(send_buf,"byebye,the guest from %s\n",inet_ntoa(client.sin_addr));
        send(connectd,send_buf,sendnum,0);

	close(connectd);
	continue;
   }
    close(listend);
    return 0;

}

TCP公开扫描程序

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<unistd.h>
#include<arpa/inet.h>

void print_usage(char * cmd)
{
	fprintf(stderr," %s usage:\n",cmd);
	fprintf(stderr,"%s IP_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("[error] about socket\n");
		exit(1);
	}
	memset(&scanip, 0, sizeof(struct sockaddr));
	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));
//这个连接是检测端口是否开放,connect建立连接成功返回0,失败返回-1
	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))   //若成功,scanport返回0
		{
			if(-1==(sockfd=socket(AF_INET,SOCK_STREAM,0)))
			{
				perror("[error] about socket\n");
				exit(1);
			}
			connect(sockfd, (struct sockaddr*)&scanip, sizeof(struct sockaddr));
            //这个连接是检测到端口可达后,建立来获得服务名
			printf("[PORT]%d is on \n",start_port);
		 	close(sockfd);
		}
	}
	exit(0);
}

Web服务器扫描程序

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<unistd.h>
#include<arpa/inet.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/time.h>



void print_usage(char * cmd)
{
	fprintf(stderr," %s usage:\n",cmd);
	fprintf(stderr,"%s IP_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("[error] about socket\n");
		exit(1);
	}
	memset(&scanip, 0, sizeof(struct sockaddr));
	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));
//这个连接是检测端口是否开放,connect建立连接成功返回0,失败返回-1
	close(sockfd);
	return ret;
}

int main(int argc, char**argv)
{
	int sockfd;
	char str1[4096];
	char recv_buf[2048];
	int len;
	int ret; 
	int mat;
	char ip;
	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))   //若成功,scanport返回0
		{
			if(-1==(sockfd=socket(AF_INET,SOCK_STREAM,0)))
			{
				perror("[error] about socket\n");
				exit(1);
			}
			connect(sockfd, (struct sockaddr*)&scanip, sizeof(struct sockaddr));
            //这个连接是检测到端口可达后,建立来获得服务名
			sp=getservbyport(htons(start_port),"tcp");
             if(NULL!=sp)
			{
				printf("[PORT]%4d is on about  %s \n",start_port,sp->s_name);
			}
			else
			{
				printf("[PORT]%4d is on unknown \n",start_port);
			}
			
			sprintf(str1,"GET / HTTP/1.1\r\nUser-Agent: curl/7.29.0\r\nHost:%s\r\nAccept:*/*\r\n",argv[1]);
			mat = send(sockfd,str1,strlen(str1),0);
			recv_buf[len]='\0';
			printf("the message from the server is:%s\n",recv_buf);
			close(sockfd);

		}
	}
	exit(0);
}

运行效果

请添加图片描述
请添加图片描述

end

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值