要求
实现一个多线程端口扫描程序:
要求:
1、能至少扫描5个IP地址;
2、针对每个iP地址,开设100个线程同时对其进行扫描;
3、如果端口打开,使用函数getservbyport获取其服务名,在屏幕上打印:IP port servername,如果是未知服务,则屏幕显示:ip port unkonown
注意点
- 注意各种参数传递的类型
- arg是一个地址,将arg地址复制到&port的时候,arg地址的数据已经被改变了。
memcpy( &port, arg, sizeof(struct port_segment) );
解决方法:创建100个线程就创建100个传过来的参数,每个线程传递不同的参数地址
代码
#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>
#include <printf.h>
#include <sys/wait.h>
#include <sys/types.h>
#define THREAD_NUM 100
void print_usage(char * cmd)
{
fprintf(stderr," %s usage:\n",cmd);
fprintf(stderr,"%s IP_Addr \n",cmd);
}
typedef struct port_segment {
struct in_addr dest;
unsigned int min_port;
unsigned int max_port;
} port_segment;
int is_connect(int port, in_addr_t addr)
{