首页 > 编程语言 >检查某个端口是否被udp网络程序占用

检查某个端口是否被udp网络程序占用

时间:2024-05-14 17:43:09浏览次数:22  
标签:udp int 占用 端口 include PORT 端口号

代码分为2部分;

1.随机生成一个未被 udp 占用的端口号

2.启动一个 udp程序,使用我们刚才找到的端口号

 

#include <iostream>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <cstring>  
#include <cstdlib>  
#include <ctime>  
#include <unistd.h>  
#include <errno.h>  
  

const int MAXLINE = 1024;  
  
int find_available_udp_port() {  
    const int MIN_PORT = 1024; // 通常1024以下的端口是保留的  
    const int MAX_PORT = 65535; // UDP端口的最大范围  
    int sockfd, port = -1;  
    struct sockaddr_in serv_addr;  
  
    srand(time(nullptr)); // 初始化随机数生成器  
    int iMaxTryCount = 100;
    int iStartTryCount = 0;
  
    // 不断尝试直到找到可用的端口  
    do {
        port = MIN_PORT + rand() % (MAX_PORT - MIN_PORT + 1); // 生成随机端口号  
          // 创建UDP socket  
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {  
            std::cerr << "ERROR opening socket" << std::endl;  
            return -1; // 错误处理  
        }  
        // 设置服务器的地址和端口  
        memset(&serv_addr, 0, sizeof(serv_addr));  
        serv_addr.sin_family = AF_INET;  
        serv_addr.sin_addr.s_addr = INADDR_ANY; // 监听所有网络接口  
        serv_addr.sin_port = htons(port); // 端口号  
  
        // 尝试绑定到端口  
        if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {  
            // 如果绑定失败,关闭socket并继续尝试  
            close(sockfd);  
            if (errno != EADDRINUSE) {  
                std::cerr << "ERROR on binding: " << strerror(errno) << std::endl;  
                return -1; // 非EADDRINUSE错误,返回错误  
            }else{
                printf("Address already in use, port:%d\r\n", port);
                //端口被占用,继续尝试其他方法... continue
            }
        } else {  
            // 绑定成功,端口可用,关闭socket并返回端口号  
            close(sockfd);  
            return port;  
        }  
        ++iStartTryCount;
    } while (iStartTryCount<iMaxTryCount); // 理论上,只要端口范围足够大,总会找到一个可用的端口  
    return port;
}  
  
int main() {  
    int port = find_available_udp_port();  
    if (port >= 0) {  
        std::cout << "Found available UDP port: " << port << std::endl;  
    } else {  
        std::cerr << "Failed to find an available UDP port." << std::endl;  
    }  


    int sockfd;  
    struct sockaddr_in servaddr, cliaddr;  
    char buffer[MAXLINE];  
    socklen_t len;  
  
    // 创建UDP socket  
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {  
        std::cerr << "ERROR opening socket" << std::endl;  
        return 1;  
    }  
  
    // 清除servaddr结构并设置地址家族  
    memset(&servaddr, 0, sizeof(servaddr));  
    servaddr.sin_family = AF_INET;  
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 监听所有网络接口  
    servaddr.sin_port = htons(port); // 端口号  
  
    // 绑定到指定的端口  
    if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {  
        std::cerr << "ERROR on binding" << std::endl;  
        return 1;  
    }  
  
    // 打印启动成功信息  
    std::cout << "Server started and listening on port " << port << std::endl;  
  
    // 无限循环,等待接收数据  
    while (true) {  
        len = sizeof(cliaddr);  
        ssize_t n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL,  
                             (struct sockaddr *) &cliaddr, &len);  
        buffer[n] = '\0';  
  
        if (n < 0) {  
            std::cerr << "ERROR in recvfrom" << std::endl;  
            break;  
        }  
  
        // 打印接收到的数据  
        std::cout << "Received from client: " << buffer << std::endl;  
  
        // (可选)发送数据回客户端  
        //sendto(sockfd, (const char *)buffer, strlen(buffer), MSG_CONFIRM,  
        //       (const struct sockaddr *) &cliaddr, sizeof(cliaddr));  
    }  
  
    // 关闭socket  
    close(sockfd);  
    return 0;  
}

 

标签:udp,int,占用,端口,include,PORT,端口号
From: https://www.cnblogs.com/music-liang/p/18191815

相关文章

  • C# WinForm 解除资源文件的占用并删除
    1.删除未解除占用的资源时2.调用WindowsAPI函数解除文件占用[DllImport("kernel32.dll",SetLastError=true)][return:MarshalAs(UnmanagedType.Bool)]staticexternboolCloseHandle(IntPtrhObject);[DllImport("kernel32.dll"......
  • 端口映射
    一个没有公网IP的内网设备要连接外网,通过网关路由器进行映射网关将数据包包装上网关IP(即公网IP)和新的未使用的端口,对应内网设备的内网IP和端口,即内网IP+内网端口----------------公网IP+公网端口多个内网IP请求则是映射成不同的公网端口,如内网IP1+内网端口1-------------......
  • TCP/UDP
    说明:TCP(TransmissionControlProtocol,传输控制协议)和UDP(UserDatagramProtocol,用户数据报协议)是Internet协议套件中的两个主要传输层协议,它们负责在网络中端到端间的数据传输。以下是关于TCP和UDP的详细说明:1.TCPTCP(传输控制协议)特点:面向连接:在数据传输前,TCP需要通过三......
  • Linux查看一个目录下占用磁盘最多的文件或目录
    想要找到占用磁盘最多的文件或目录,可以使用du和sort命令:du-h/path/to/directory|sort-rh|head-n10其中:du-h/path/to/directory用于计算指定目录下的所有文件和子目录的大小,并以人类可读的格式显示。sort-rh用于按磁盘使用情况的大小(逆序)对输出进行排序。head......
  • 解决端口被占用问题
    step1:当我们运行项目的时候,控制台打印出现error:此时会显示端口地址已经被占用,端口占用的解决办法:step2:打开cmd,命令提示符,输入netstat-ano 会显示所有已经在运行的端口,step3:输入你想要查的正在占用的端口号,netstat-ano|findstr8080step4:此时会显示端口8080对应的tcp号......
  • ssh修改端口后,gitee(git)连接不上
    将本服务器的ssh端口22改为1068后,gitpull和gitpush时,出现:ssh:connecttohostgitee.comport[端口]:Connectiontimedout错误目测是因为,gitee的链接,使用的是SSH协议,但是服务器的端口由22变为了1068,所以请求gitee服务器时,也由22变更为了1068,所以只要SSH协议的链接加上22......
  • 一三云服务器配置教程:要开放哪些端口?如何设置宝塔端口更安全?
    布署宝塔面板云服务器需要开放哪些端口?1、以一三云服务器为例,如需完整使用宝塔的所有功能,需要放行如下防火墙规则:20/21————–(FTP主动模式端口)39000-40000——(FTP被动模式-Linux 系统)3000-4000———(FTP被动模式– Windows系统)22——————(SSH远程登录)80—————(网站)4......
  • 一三云服务器宝塔面板FTP上传需要开放哪些端口
    在服务器的配置和维护中,FTP(文件传输协议)是一个常见的协议,用于在客户端和服务器之间传输文件。当涉及到FTP上传时,确保正确的端口已经开放是至关重要的。本文将详细讨论在FTP上传过程中需要开放的端口,并解释这些端口的作用和配置方法。首先,FTP主要使用两个类型的端口:控制连接端口和......
  • Springboot单机多副本运行,解决端口冲突
    一、代码方式(修改配置类)@BeanpublicWebServerFactoryCustomizer<ConfigurableWebServerFactory>MyCustomizer(){returnnewWebServerFactoryCustomizer<ConfigurableWebServerFactory>(){@Overridepublicvoidcustomize(ConfigurableWebSer......
  • Docker 桥接模式下端口映射会绕过防火墙
    问题描述使用Docker桥接模式启动了一个MySQL容器查看防火墙发现并未开启3306端口,但该宿主机3306端口仍能被第三方机器访问telnet152.51.32.113306 问题本质Docker在进行端口映射时,已经自动使用iptables命令修改了防火墙规则;并且这个规则不会被ufw显示、管理;甚至插入的......