我正在编写端口扫描程序,我想验证特定端口是否正在运行该端口上预期的标准服务,例如SSH
和HTTP
。我知道其中一种方法是向该端口发送查询并分析返回的信息。例如,SSH在连接时立即向我发送版本信息。但是,当我在IP地址上执行connect()
端口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
中检索这些信息。