3

我需要建议创建一个简单的端口扫描器,它需要检测某些特定设备是否从其 IP/MAC 地址连接到网络。

我正在使用 Windows 7,最好使用 C++ Builder 2010、java 或 Qt。

该库必须属于公共领域或同等领域,因为我的软件是专有软件。

你会建议什么图书馆?你知道我可以从任何免费软件开始,或者任何例子吗?

使用 Indy 套接字或 Synapse TCP/IP 库怎么样?

4

3 回答 3

7

任何 TCP/IP 库都可以工作。Indy、ICS、Synapse,它们都可以在 C++Builder 中正常工作。由于 Indy 附带 C++Builder,您可以从它开始,但您当然不限于它。

它们都在 Windows 内部使用 WinSock,因此您可以直接对 WinSock API 进行编程,而根本不使用任何库。您需要做的就是WSAStartup()在程序启动时调用一次,然后调用socket()connect()要检查的每个端口。要检查多个端口,您可以将套接字置于非阻塞模式,ioctlsocket()然后使用select()WSAAsyncSelect()WSAAsyncEvent()CreateIoCompletionPort()/GetQueuedCompletionStatus()来检测是否connect()成功/失败,或者您可以将套接字置于阻塞模式(它们的默认模式)并使用 worker要调用的线程connect(),让它直接告诉你它是否成功/失败。

于 2013-11-13T02:24:34.217 回答
2

开放端口是其上有监听应用程序的端口。检查 TCP 端口的最简单方法是尝试连接它,如果连接建立,则该端口是打开的。

高级方法基于指纹和概率数据包,您可以阅读nmap如何检测开放端口。

最后,pcap是一个用于高级网络编程的有用库。

于 2013-11-12T10:16:14.473 回答
0

对于 Borland C++ 构建器?抱歉,Borland C++ builder 的内容不多,但如果你可以使用 Visual C++ Express 和 WINSOCK 库,那么它就这么简单:

Winsock 端口扫描器:

#include <stdio.h>
#include <winsock.h>
#include <stdlib.h>
#pragma comment(lib,"WSOCK32.LIB")

void main()
{
   WSADATA data;
   SOCKET sock;
   int err,i,startport,endport;
   char ip[20];
   struct sockaddr_in sock_addr;
   FILE*fp1;

   printf("ip: ");
   scanf("\n%s",ip);
   printf("start port: ");
   scanf("%d",&startport);
   printf("end port: ");
   scanf("%d",&endport);
   if((WSAStartup(MAKEWORD(2,0),&data)!=0))
   {
      printf("Error: Winsock did not init!!!\n\n");
   }
   else
   {
      for(i=startport;i<endport;i++)
      {
         sock=socket(AF_INET,SOCK_STREAM,0);
         sock_addr.sin_family=PF_INET;
         sock_addr.sin_port=htons(i);
         sock_addr.sin_addr.s_addr=inet_addr(ip);
         printf("Checking port %d\n",i);
         err=connect(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr));
         if(err==0)
         {
            printf("Port Open!!!\n\n\a");
            fp1=fopen("ports.txt","a+");
            fprintf(fp1,"Port is open: %d\n\n",i);
            closesocket(sock);
            fclose(fp1);
         }
         else
         {
            printf("Port Closed!!!\n\n");
         }
      }
      WSACleanup();
      system("ports.txt");
   }
}
于 2013-11-12T12:57:14.720 回答