c - 如何检查远程UDP端口是否打开? C

标签 c sockets udp

<分区>

测试TCP很容易,那么UDP呢?这里:Check if OpenVPN UDP Port is open我读到这是不可能的。但是,这里:How to retrieve both TCP and UDP ports with Nmap?事实证明 nmap 可以做到这一点,所以我认为这是可能的。

我写了一段很简单的代码:

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

int main(int argc, char **argv)
{
    char * ip_addr;
    int port;

    int sockfd;
    struct sockaddr_in server_addr;

    if (argc != 3)
    {
        fprintf(stderr,"Usage: %s IP port \n", argv[0]);
        exit(1);
    }

    ip_addr = argv[1];
    port = atoi(argv[2]);

    if (port <= 0)
    {
        fprintf(stderr,"error: invalid port\n");
        exit(1);
    }

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("socket");
        exit(1);
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    inet_aton(ip_addr, &server_addr.sin_addr);

    char msg[] = "Just a text\n";
    char buffer[255];
    int recv_size, send_size;

    if ((send_size = sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr*) &server_addr, sizeof(server_addr))) < 0)
    {
        close(sockfd);
        if (errno != 0)
        {
            perror("send");
            exit(1);
        }
    }else if(send_size == 0)
    {
        printf("sent\n");
    }
    else if (send_size > 0)
    {
        printf("sent\n");
    }

    if ((recv_size = recvfrom(sockfd, buffer, 255, 0, NULL, NULL)) == 0)
    {
        close(sockfd);
        if (errno != 0)
        {
            perror("recv");
            exit(1);
        }
    }

    buffer[recv_size] = '\0';

    close(sockfd);


    return 0;
}

但它什么也不打印,只是结束。所以很难说发生了什么,端口是否打开。有没有简单的方法,使用套接字,来测试远程UDP端口是否打开?

最佳答案

It's easy to test for TCP [ports being open], but how about UDP?

无法可靠地检测到任一类型的远程端口是否已关闭。甚至不可能可靠地检测到远程 TCP 端口是否打开——您能做的最好的事情就是通过成功连接到它。远程机器可能会肯定地拒绝您的连接尝试,即使它会接受来自另一台机器的连接,并且它可能会默默地忽略该端口是否打开(对其他机器)或关闭的尝试。

所有这些也适用于 UDP,除了你不能依赖远程机器的响应,即使它接受了你的数据包。您可能得到肯定的拒绝,但如果您不这样做,您将不会从这次尝试中学到任何东西。您可以在远程端口上扫描正在运行的特定 UDP 服务并为来自您机器的请求提供服务,但是您不能更一般地指望能够确定端口是否打开。

关于c - 如何检查远程UDP端口是否打开? C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42539898/

相关文章:

C - 从 UDP 套接字缓冲区读取字节 (Linux)

c - send() 和 receive() 使用一个套接字?

Python dhcp 客户端

c - 字符串打印

对 poll() 和 recvfrom() 的混淆

选择一个已被使用的本地源端口

c - 什么是 servaddr.sin_addr.s_addr=INADDR_ANY

c - 这个函数将数据发送到GPU进行计算?

c - 应该如何在 Ruby 扩展中对 VALUE* 数组进行标记?

java - BufferedReader readLine() block