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