|
|
先把代码贴出来,详细的流程与注释明天再写
首先是服务器端的代码,程序的主体部分是客户端的多线程扫描,所以服务器端的代码编写的相对简单,没有过多的安全性检查的处理。
// my_server.cpp
// g++ my_server.cpp -o server
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- int main (int c , char ** v)
- {
- struct sockaddr_in server_addr ;
- int sockfd ;
- sockfd = socket ( AF_INET , SOCK_STREAM , 0 ) ;
- server_addr.sin_family = AF_INET ;
- server_addr.sin_port = htons (1027) ;
- inet_aton ("127.0.0.1" , &server_addr.sin_addr ) ;
- bind (sockfd ,(struct sockaddr*)&server_addr , sizeof(struct sockaddr_in) ) ;
- listen ( sockfd , 10 ) ;
- for (;;) {}
- return 0 ;
- }
// 后面的代码均属于 client 端,使用Makefile 进行编译
// Makefile
- CPPFLAGS = -O3
- LDFLAGS = -lpthread
- all: Main
- clean :
- rm -f *.o
- Main: Main.o my_scanner.o
- g++ -o $@ $^ $(LDFLAGS)
// my_scanner.h
- // my_scanner.h
- #ifndef MY_SCANNER_H
- #define MY_SCANNER_H
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- struct _scan_segment
- {
- unsigned short int from_port ;
- unsigned short int to_port ;
- struct in_addr scan_addr ;
- } ;
- typedef _scan_segment scanSegment ;
- class Scanner
- {
- private :
- std::vector pthreadList ;
- int threadNum ;
- int connfd ;
- struct in_addr scan_addr ;
- int scan_max_port ;
- int scan_len ;
- public :
- Scanner ( int _threadNum , struct in_addr _scan_addr , int _scan_max_port ) ;
- // static int do_scan ( struct sockaddr_in ) ;
- // void * scanner ( void *) ;
- void run ( void ) ;
- } ;
- #endif // my_scanner.h
// myscanner.cpp
// myscanner.cpp
#include "my_scanner.h"
using namespace std ;
static void log_info ( const char *err_info , int location )
{
fprintf (stderr, "[error]: %s, [line]: %d\n" , err_info , location) ;
perror ("exit function errinfo ") ;
exit ( 1 ) ;
}
Scanner::Scanner ( int _threadNum , struct in_addr _scan_addr , int _scan_max_port )
{
threadNum = _threadNum ;
scan_max_port = _scan_max_port ;
if ( threadNum > scan_max_port )
threadNum = scan_max_port ;
scan_len = scan_max_port / threadNum ;
// copy addr
scan_addr = _scan_addr ;
for ( int i = 0 ; i |
|
|