最近刚开始学习网络编程,自己写了一个扫描器,使用connect连接测试,可是,我发现,除了我自己的机器,其他的机器所有端口都是打开的,为什么呢

解决方案 »

  1.   

    /********************************************/
    /* 端口扫描器 源代码 */
    /* PortScanner.c */
    /********************************************/#include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #include <winsock2.h>
    #include <windows.h>
    #include <commctrl.h>
    /*功能定义:对某个IP段进行端口扫描
     *参数定义:共4个参数
     *  开始地址,结束地址,开始端口,结束端口
     *  无开始地址,默认开始地址==0.0.0.0
     *  无结束地址,默认结束地址==开始地址
     *  无开始端口,默认开始端口==0
     *  无结束端口,默认结束端口==开始端口
     *参数形式:Scan /h <开始地址> [结束地址] /p <开始端口> [结束端口]
     */
    extern int OutCode_PortScan(FILE *fpout);
    void Help(char *app)
    {
      fprintf(stderr,"This program will scan host port!\n");
      fprintf(stderr,"Usage: %s /h <start host [end host]> /p <start port [end port]
    >\n", app);
      fprintf(stderr,"Press any key to show itself\'s C source and exit this program
    !\n");
      getch();
      OutCode_PortScan(NULL);
    }
    #define HOST_PARAM    1
    #define PORT_PARAM    2
    #define BAD_PARAM     0
    #define IPTOLONG(addr)    MAKEIPADDRESS(FOURTH_IPADDRESS(addr),THIRD_IPADDRESS(a
    ddr),SECOND_IPADDRESS(addr),FIRST_IPADDRESS(addr))
    #define LONGTOIP(addr)    MAKEIPADDRESS(FOURTH_IPADDRESS(addr),THIRD_IPADDRESS(a
    ddr),SECOND_IPADDRESS(addr),FIRST_IPADDRESS(addr))
    FILE *fp=NULL;
    void closefile()
    {
      if(fp)
        fclose(fp);
    }
    int main(int argc, char *argv[])
    {
      WSADATA wsaData;
      WORD wVersionRequested=MAKEWORD(1,1);
      int startHost,endHost;
      int startPort,endPort;
      char *p;
      int i,n=BAD_PARAM;  int mysocket=0;
      int pcount = 0;
      struct sockaddr_in my_addr;
      struct in_addr  inaddr;
      if(argc < 5) //至少5个参数,最多7个
      {
        Help(argv[0]);
        exit(1);
      }
      //分析参数
      i=1;
      while(i<argc)
      {
        p=argv[i++];
        if(*p=='/')
        {      switch(*++p)
          {
          case 'h':
          case 'H':
            n=HOST_PARAM;
            startHost=inet_addr(argv[i++]);
            endHost=startHost=IPTOLONG(startHost);
            continue;
          case 'p':
          case 'P':
            n=PORT_PARAM;
            endPort=startPort=atoi(argv[i++]);
            continue;
          default:
            n=BAD_PARAM;
            break;
          }//end switch p
        }//end if *p
        //根据状态复制数据
        switch(n)
        {
        case HOST_PARAM:
          endHost=inet_addr(p);
          endHost=IPTOLONG(endHost);
          break;
        case PORT_PARAM:
          endPort=atoi(p);
          break;
        default://出现错误
          Help(argv[0]);
          exit(1);
        }//end switch n
      }//end while
      //参数正确,开始调试数据
      //调整顺序
      if(startHost>endHost)
      {
        n=endHost;
        endHost=startHost;
        startHost=n;
      }
      if(startPort>endPort)
      {
        n=endPort;
        endPort=startPort;
        startPort=n;
      }
      if (WSAStartup(wVersionRequested , &wsaData))
      {
        printf("Winsock Initialization failed.\n");
        exit(1);
      }
      //打开记录文件
      fp=fopen("PortScan.txt","w");
      atexit(closefile);
      //循环主机
      for(n=startHost;n<=endHost;n++)
      {
        inaddr.S_un.S_addr=LONGTOIP(n);
        printf("\rScaning host [%s]\n",inet_ntoa(inaddr));
        if(fp)
          fprintf(fp,"Scaning host [%s]\n",inet_ntoa(inaddr));
        pcount=0;
        //循环端口
        for(i=startPort; i <=endPort; i++)
        {
          int timeout=100;
          if((mysocket = socket(AF_INET, SOCK_STREAM,0)) == INVALID_SOCKET)
          {
            printf("\rCannot Open Host [%s]\n",inet_ntoa(inaddr));
            if(fp)
              fprintf(fp,"Cannot Open Host [%s]\n",inet_ntoa(inaddr));
            break;//跳出循环,进行下一次扫描
          }
          my_addr.sin_family = AF_INET;
          my_addr.sin_port = htons((unsigned short)i);
          my_addr.sin_addr = inaddr;
          //setsockopt(mysocket,SOL_SOCKET,TCP_NODELAY,(char*)&timeout,sizeof(timeou
    t));
          printf("\rScaning %d",i);
          if(connect(mysocket, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
     == SOCKET_ERROR)
          {
            closesocket(mysocket);
          }
          else
          {
            pcount++;
            printf("\rPort %d - open\n", i);
            if(fp)
              fprintf(fp,"Port %d - open\n", i);
          }
        }
        if(INVALID_SOCKET!=mysocket)
        {
          //printf("\x0d%d ports opened on host [%s]\n",pcount,inet_ntoa(inaddr));
          closesocket(mysocket);
        }
      }  WSACleanup();
      return 0;
    }
      

  2.   

    概念型错误啊。
    对tcp的编程过程还认识不清楚。你看看tcp的简单例子吧。
      

  3.   


    if(connect(mysocket, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
     == SOCKET_ERROR){
    连接不能,端口为关

    else{
    连接成功,端口为开
    }closesocket