如何检索所有TCP UDP开放端口?

时间:2012-01-08 21:07:55

标签: c sockets port

我需要制作一个自定义端口扫描程序,只扫描打开的TCP和UDP端口。我正在使用带套接字的标准C工作。目前我检索了我设置的范围内的所有端口。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <errno.h>

int scanPort(struct hostent *hostaddr,int port){
    char responce[1024];
    char *message="checking port";
    struct sockaddr_in server_address;
    int socket_d;
    int rval;
    socket_d = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(socket_d == -1)
    {
        perror("Socket()\n");
        return errno;
    }
    memset(&server_address,0,sizeof(server_address));

    server_address.sin_family=AF_INET;
    server_address.sin_port=htons(port);

    memcpy(&server_address.sin_addr,hostaddr->h_addr,hostaddr->h_length);

    rval = connect(socket_d,(struct sockaddr *) &server_address, sizeof(server_address));

    if(rval == -1)
    {
        close(socket_d);    
        return 0;
    }else{
        close(socket_d);
        return 1;
    }

}
int main(int argc, char **argv)
{
    if(argc < 4){
        printf("Exemplu: ./portscanner <adresa_ip> <port_pornire> <port_oprire> \n");
        return (EINVAL);
    }

    int startPort;
    int endPort;
    int port;
    struct hostent *host_address;

    host_address = gethostbyname( argv[1] );
    startPort = atoi(argv[2]);
    endPort = atoi(argv[3]);

    for(port = startPort;port<=endPort;port++)
    {
        if(scanPort(host_address,port)==1){
            printf("Port %d is open\n",port);
        }
    }
}

在示例中,您可以看到我是如何尝试解决此问题的。但我没有看到只检查TCP和UDP端口的方法。请帮帮我。

此致 Badea Sorin!

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。我建议您安装nmap并阅读manual。 许多扫描方法在那里实现并在手册中描述。

如果您需要更多详细信息,也可以参考源代码。

祝你好运。