免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2080 | 回复: 1
打印 上一主题 下一主题

[C] 一个端口扫描的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-07 09:55 |只看该作者 |倒序浏览
我想用下面这func扫描指定主机的端口.
在外层使用for调用它.
现在出了个问题是,扫描有的ip没问题,有的ip会非常慢,甚至没结果(都是内网IP,无firewall),而用nmap扫描就没事.
  1. #include "include/fus.h"
  2. int scan_connect(char *ip, int port)
  3. {

  4.         int sockfd, ifok, i, retconn, retval, len, flags,error;
  5.         fd_set wfds;
  6.         struct timeval timeout;
  7.         struct sockaddr_in servaddr;
  8.         timeout.tv_sec = TIMEOUT;

  9.         sockfd = socket(AF_INET,SOCK_STREAM,0);
  10.         if (sockfd < 0)
  11.         {
  12.                 FINFO("Can 't creat a socket \n");
  13.                 return CONNECT_FAIL;
  14.         }
  15.         /* SET METHOD OF NON-BLOCKED SOCKET*/
  16.         if ((flags=fcntl(sockfd, F_GETFL, 0)) < 0)
  17.         {
  18.                 FINFO("nfcntl error \n");
  19.                         return CONNECT_FAIL;
  20.         }
  21.         if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) < 0)
  22.         {
  23.                 FINFO("nfcntl error \n");
  24.                         return CONNECT_FAIL;
  25.         }

  26.         bzero(&servaddr,sizeof(servaddr));
  27.         servaddr.sin_family=AF_INET;
  28.         servaddr.sin_port=htons(port);
  29.         inet_pton(AF_INET, ip, &servaddr.sin_addr);

  30.         if ((ifok = connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) < 0)
  31.                 if (EINPROGRESS != errno)
  32.                 {
  33.                         return CONNECT_FAIL;
  34.                 }
  35.         FD_ZERO(&wfds);
  36.         FD_SET(sockfd, &wfds);
  37.         retval = select(sockfd+1, NULL, &wfds, NULL, &timeout);
  38.         if (0 == retval || -1 == retval)                                                /* ....select.. */
  39.         {
  40.                 close(sockfd);
  41.                 return CONNECT_FAIL;
  42.         }
  43.         if (FD_ISSET(sockfd, &wfds))                                                        /* sockfd.. */
  44.         {
  45.                 len = sizeof(error);
  46.                 if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
  47.                 {
  48.                         return CONNECT_FAIL;
  49.                 }
  50.         }
  51.         else
  52.         {
  53.                 FINFO("\nFD_ISSET:");
  54.                 return CONNECT_FAIL;
  55.         }
  56.         if (error)                                                                                 /* ........ */
  57.         {
  58.                 close(sockfd);
  59.                 return CONNECT_FAIL;
  60.         }
  61.         else                                                                                        /* ......0 */
  62.         {
  63.                 printf("port %d is opened!\n", port);
  64.                 return CONNECT_OK;
  65.         }
  66. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-09-07 12:37 |只看该作者
nmap有SYN扫描,还有常规的connect扫描,你的代码好像这两种都不是~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP