当前位置: 技术问答>linux和unix
非阻塞connect实现端口扫描的问题-connect提前返回怎么处理?
来源: 互联网 发布时间:2016-03-21
本文导语: 用非阻塞connect来实现,代码在后面给,先说问题(几种情况): 1. 有时运行没有任何输出(扫的是内网的另一台机器,有几个端口打开的),但是马上再运行一次又可以了(有时能扫出所有的端口,有时只有一部分) ...
用非阻塞connect来实现,代码在后面给,先说问题(几种情况):
1. 有时运行没有任何输出(扫的是内网的另一台机器,有几个端口打开的),但是马上再运行一次又可以了(有时能扫出所有的端口,有时只有一部分)
2. 和1不同的是,第一次运行可以扫出部分端口,有时连续运行几次都只能扫出几个,而不是全部
3. 正常
我怀疑是在select之前就有connect返回,不知道这个是怎么处理的呢?网上也没找到这样的资料,而且多数端口扫描程序都是阻塞的,根本没用。
希望大家都来帮个忙吧,也讨论下~~下面把代码贴出来!
1. 有时运行没有任何输出(扫的是内网的另一台机器,有几个端口打开的),但是马上再运行一次又可以了(有时能扫出所有的端口,有时只有一部分)
2. 和1不同的是,第一次运行可以扫出部分端口,有时连续运行几次都只能扫出几个,而不是全部
3. 正常
我怀疑是在select之前就有connect返回,不知道这个是怎么处理的呢?网上也没找到这样的资料,而且多数端口扫描程序都是阻塞的,根本没用。
希望大家都来帮个忙吧,也讨论下~~下面把代码贴出来!
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MINPORT 0
#define MAXPORT 1000
int main(int argc,char **argv)
{
int fd[MAXPORT];
int flags,n,i,rst;
int port[MAXPORT];
struct sockaddr_in addr[MAXPORT];
fd_set rset,wset;
struct timeval tm;
int addrsize=sizeof(struct sockaddr);
struct servent *sent;
FD_ZERO(&rset);
FD_ZERO(&wset);
tm.tv_sec=5;
tm.tv_usec=0;
for(i=MINPORT;i