如何通过C编程实时获取本地监听端口?

时间:2018-08-07 08:54:15

标签: c linux networking tcp kernel

我想编写一个LINUX C应用程序,它可以监视提供Web服务的系统TCP侦听端口。每当侦听一个新端口或释放一个端口时,我都可以实时检测到它。 Linux是否提供系统调用来提供此功能?还是应该挂钩内核功能?

1 个答案:

答案 0 :(得分:-3)

下面的代码将帮助您检查端口是否打开,是否需要实时处理;您可以在单独的线程中连续运行该程序。

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

    int main(int argc, char *argv[])
    {
        int portno     = 22;
        char *hostname = "localhost;

        int sockfd;
        struct sockaddr_in serv_addr;
        struct hostent *server;

        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0) {
            error("ERROR opening socket");
        }

        server = gethostbyname(hostname);

        if (server == NULL) {
            fprintf(stderr,"ERROR, no such host\n");
            exit(0);
        }

        bzero((char *) &serv_addr, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        bcopy((char *)server->h_addr,
             (char *)&serv_addr.sin_addr.s_addr,
             server->h_length);

        serv_addr.sin_port = htons(portno);
        if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
            printf("Port is closed");
        } else {
            printf("Port is active");
        }

        close(sockfd);
        return 0;
    }