QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1480|回复: 11

搜索特定ip段的特定端口,怎么写??

[复制链接]
发表于 2004-3-8 14:11:59 | 显示全部楼层 |阅读模式
要探测指定ip段的一个特定端口是否是开的
比如说要搜一个ip段
看哪个机子的ftp是开的,也就是21端口了
我用connect()连每个机子的21端口
如果返回-1就表示没开
非-1就是开的
但是我运行这个程序的时候
碰到21端口关闭的ip
程序就卡在那里了
是怎么回事?
应该怎么写?
请各位指教
或者有源程序参考更好
谢了
 楼主| 发表于 2004-3-8 18:32:58 | 显示全部楼层
下面是我的代码:
请帮忙指出错误

[code:1]
#include "ftpserch.h"

int main(int argc, char *argv[])
{



  int sockfd;
  int len;
  struct in_addr address1;
  struct in_addr address2;
  struct sockaddr_in tmp;
  int result;



  if(argc != 3){
    printf("usage:command IP1 IP2!!\n");
    exit(1);
  }



  if(  ((address1.s_addr = inet_addr(argv[1])) == -1) || ((address2.s_addr = inet_addr(argv[2])) == -1)  ){
    printf("IP error!!\n");
    exit(2);
  }


  if(strcmp(argv[1],argv[2]) > 0 ){
    printf("IP1 should less than IP2!!\n");
    exit(3);
  }

  for(;address1.s_addr <= address2.s_addr;address1.s_addr++){

    sockfd = socket(AF_INET,SOCK_STREAM,0);
    tmp.sin_family = AF_INET;
    tmp.sin_port = htons(21);
    tmp.sin_addr.s_addr = address1.s_addr;
    len = sizeof(tmp);

    result = connect(sockfd,(struct sockaddr *)&tmp,len);

    if(result != -1){
      printf("%s\n",inet_ntoa(tmp.sin_addr));
      
    }
  
    close(sockfd);
  }

  exit(0);
}
[/code:1]
回复

使用道具 举报

发表于 2004-3-9 09:34:27 | 显示全部楼层
没看代码 但如果只是卡住一段时间是正常的 协议占在等待超时 默认的时间很长的 好像三次尝试有75秒吧 所以别人的扫描程序都是动辄几十个线程的
回复

使用道具 举报

发表于 2004-3-9 10:03:56 | 显示全部楼层
同意wsm的看法。虽然也许有其它可能,但我所知有限,仅想到此一种。

以4.4BSD为例,当你开始连接时,会发一个SYN,在一直没有响应SYN的情况下,6秒后和24秒后会再发一个SYN,并在75秒后终止连接。(某些系统可调节这个参数)(引自Unix network programming ---W.Richard Stevens,p89)

有趣的是,当服务器有响应,而你却一直没有任何行动(发ACK,SYN=0 或RST),就是一个半开放扫描,如果同时有许多这样的半开放扫描,就会造成DOS,因为服务器也要等待几十秒结束连接。只是,许多半开放扫描并不想造成DOS,他们只想逃避系统安全日志,因为许多日志只记录三次完成的连接(现在的入侵检测可以检测半开放连接了)。
回复

使用道具 举报

 楼主| 发表于 2004-3-9 12:41:06 | 显示全部楼层
我知道有75秒的阻塞时间
但是我等了n分钟后也没有返回错误值阿
我只是探测这个端口开没开
只要是没响应
就返回错误值
或者说
在1秒钟内这个ip的connect还没返回值的话
就强行退出
开始下一个ip
这样可不可以呢
如果行应该怎么做
我只想到在子进程中connect
如果1秒钟没返回
则父进程发信号杀死子进程
然后开始下一个子进程(暂不考虑多进程情况)
不知道有没有什么别的方法??
回复

使用道具 举报

发表于 2004-3-9 13:40:02 | 显示全部楼层
对不起,误会了你的意思。
你的for循环中打开了许多套接字,却没有关闭,只是在for之外关闭了最后一个。不知我说的对否,以及这是否与你的问题有关系?
回复

使用道具 举报

 楼主| 发表于 2004-3-9 19:02:24 | 显示全部楼层
不好意思
笔误
呵呵,
我把close移进去了
还是那个问题哦
回复

使用道具 举报

发表于 2004-3-10 09:55:39 | 显示全部楼层
我想你的for循环中加一条打印语句,也许能看出原因。比如每个阻塞是75秒,你遇到一个C网100个ftp不开不就会等7500秒?

如有不对,请多指点。
回复

使用道具 举报

 楼主| 发表于 2004-3-10 12:29:28 | 显示全部楼层
不过现在是碰到21没开的就没反应了
75秒以后也没反应
回复

使用道具 举报

发表于 2004-3-10 14:19:05 | 显示全部楼层
我估计你使用的是Little-endian字节序的机器,这种情况下,一个IP比如202.2.3.4 在机器中存储为一个无符号长整形,即04 03 02 ca (16进制)。 在你的for中自加后为04 03 02 cb !即你要连接的下一个IP是203.2.3.4而并不是202.2.3.5!这样你进入了一个长为2的24次方的循环!
回复

使用道具 举报

发表于 2004-3-10 14:29:22 | 显示全部楼层
是否是楼上说的这个问题还要看看 不过楼主这个比较地址做循环的确是很烂的代码
回复

使用道具 举报

 楼主| 发表于 2004-3-12 13:07:50 | 显示全部楼层

的确是很烂啦
呵呵
不知道应该怎么写哦
有没有类似得源码阿
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 19:41 , Processed in 0.048349 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表