我需要建议创建一个简单的端口扫描器,他需要检测某些特定设备是否通过其IP / MAC地址连接到网络。
我正在使用Windows 7,最好使用C ++ Builder 2010,或java或Qt。
图书馆必须属于公共领域或同等学历,因为我的软件是专有软件。
你会建议哪个图书馆?你知道我可以从哪个免费软件或任何例子开始?
如何使用Indy Sockets或Synapse TCP / IP库?
答案 0 :(得分:4)
任何TCP / IP库都可以使用。 Indy,ICS,Synapse,它们都可以与C ++ Builder一起使用。由于Indy附带了C ++ Builder,你可以从那开始,但你当然不限于此。
他们都在Windows上内部使用WinSock,因此您可以直接编程到WinSock API而根本不使用任何库。您需要做的就是在程序启动时调用WSAStartup()
一次,然后为要检查的每个端口调用socket()
和connect()
。要检查多个端口,您可以使用ioctlsocket()
将套接字置于非阻止模式,然后使用select()
,WSAAsyncSelect()
,WSAAsyncEvent()
或CreateIoCompletionPort()
/ GetQueuedCompletionStatus()
检测connect()
是否成功/失败,或者您可以将套接字置于阻塞模式(默认模式)并使用工作线程调用connect()
并让它直接告诉您它成功/失败。
答案 1 :(得分:1)
开放端口是一个在其上有监听应用程序的端口。检查TCP端口的最简单方法是尝试连接它,如果建立连接,则该端口打开。
高级方法基于指纹识别和prob数据包,您可以阅读nmap检测开放端口的方式。
最后,pcap是高级网络编程的有用库。
答案 2 :(得分:0)
对于Borland C ++构建器?对不起,Borland C ++ builder的用户不多, 但如果您可以使用Visual C ++ Express和WINSOCK库,那么它就像这样简单:
Winsock portscanner:
#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");
}
}