2014-12-02 61 views
-1

我正在写一个端口扫描器,我想验证一个特定端口是否正在运行该端口上预期的标准服务,如SSHHTTP。我知道其中一种方法是发送一个查询到该端口并分析返回的信息。例如,SSH在连接后立即向我发送版本信息。但是,当我做了connect()到一个IP地址的端口22,我只得到Error number: 110. Error message: Connection timed out。任何想法将不胜感激。我该如何检查远程主机上运行的服务?

整个代码是一个很长的故事。我在这里贴一些摘录。

struct sockaddr_in dest_addr; 
dest_addr.sin_family = AF_INET; 
dest_addr.sin_port = htons(22); 
dest_addr.sin_addr.s_addr = inet_addr("8.8.8.8"); 

int service_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
if (service_sock < 0) { 
    printf("Error creating service socket. Error number: %d. Error message: %s\n", errno, strerror(errno)); 
    exit(0); 
} 

int dest_addr_len = sizeof(dest_addr); 
if (connect(service_sock, (struct sockaddr *)&dest_addr, dest_addr_len) < 0) { // stuck here 
    printf("Error connection. Error number: %d. Error message: %s\n", errno, strerror(errno)); 
    exit(0); 
} 

为了澄清这个问题,我需要展示一个例子。我只是想出了一种方法来验证HTTP服务。那就是发送一个字符串"GET/HTTP\n\n"到目的地址。然后调用recv()函数来读取返回的消息。我可以得到这样的东西。

HTTP/1.0 400 Bad Request 
Content-Type: text/html; charset=UTF-8 
Content-Length: 1419 
Date: Tue, 02 Dec 2014 05:56:25 GMT 
Server: GFE/2.0 
... 

我可以阅读HTTP版本是从第一行1.0

在这里,我想检查远程主机上的许多服务,包括但不限于SSH,HTTP。我不认为猜测是一个好主意。所以我需要一个通用的方法从dest_addr中检索这些信息。

+0

不'连接超时'意味着远程主机没有在该端口上响应? – Ubica 2014-12-02 01:25:39

+0

@Ubica它的确如此。我只是不知道我应该发送什么样的查询,或者,我怎么能从那个远程主机得到响应。 – 2014-12-02 01:29:26

+0

看看这个问题http://stackoverflow.com/questions/11547082/fastest-way-to-scan-ports-with-java – Ubica 2014-12-02 06:01:13

回答

0

好的,最后我需要回答我自己的问题。我刚刚完成了这项验证工作,并为它写了一个post

相关问题