gpt4 book ai didi

C 扫描远程服务器上的开放端口

转载 作者:太空宇宙 更新时间:2023-11-04 03:28:45 25 4
gpt4 key购买 nike

我试图编写一个 C 程序来检查远程服务器上的开放端口。

重要提示:我知道有 nmap 之类的解决方案,但这里的关键是让我自己学习如何编写这样的程序。

我写了下面的代码,它会提示您询问 IP 和端口。

现在有两种解决方案:

a) 已输入端口号 -> 将测试与该端口的连接

b) 将进入“扫描”-> 将检查从 1 到 5000 的每个端口是否成功连接。

所以我的问题是,每当我输入“扫描”时,只有端口 21 会被列为“打开”。

    #include <stdio.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>

#define OK 0
#define NO_INPUT 1
#define TOO_LONG 2

static int getLine (char *prmpt, char *buff, size_t sz){

int ch, extra;

if (prmpt != NULL) {
printf("%s", prmpt);
fflush(stdout);
}

if (fgets(buff, sz, stdin) == NULL)
return NO_INPUT;

if (buff[strlen(buff)-1] != '\n') {
extra = 0;
while (((ch = getchar()) != '\n') && (ch != EOF)){
extra = 1;
}
return (extra == 1) ? TOO_LONG : OK;
}

buff[strlen(buff) - 1] = '\0';
return OK;
}



int main (int argc, char *argv[])
{

int socket_desc;
struct sockaddr_in server;

socket_desc = socket(AF_INET, SOCK_STREAM, 0);

if (socket_desc == -1){
printf("Could not open socket\n");
}

char ip[30];
char port[5];



getLine("IP> ", ip, sizeof(ip));
getLine("Port> ", port, sizeof(port));

if (strcmp("scan", port) == 0){
puts("scanning....");
server.sin_addr.s_addr = inet_addr(ip);
server.sin_family = AF_INET;

for (int i = 1; i < 5000; i++){
server.sin_port = htons(i);
if (connect(socket_desc, (struct sockaddr * )&server, sizeof(server)) < 0 ) {

}
else {
printf("Open port: %d\n", i);
}



}


}
else {
int iport = atoi(port);

server.sin_addr.s_addr = inet_addr(ip);
server.sin_family = AF_INET;
server.sin_port = htons(iport);

if (connect(socket_desc, (struct sockaddr * )&server, sizeof(server)) < 0 )
{
puts("connect error");
return 1;
}

puts("Connected");
}

return 0;

}

为什么只有端口 21 (FTP) 被列为打开的?是否由于我使用的功能的性质,这些功能仅用于数据连接(当时是端口 21)。我是否应该使用不同的功能甚至可能是不同的方法(出于我的头脑,也许 ping 一个端口(如果可能)而不是尝试连接)

我的最终目标是编写一个程序来扫描服务器并列出打开的端口以及那里正在运行的端口(SSH、SMTP 等)

感谢您的帮助!!

最佳答案

一旦连接了一个套接字,进一步尝试连接它肯定会失败并返回EISCONN。您需要在每次迭代中创建一个新套接字(并且不要忘记关闭它)。

关于C 扫描远程服务器上的开放端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39003492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com