C++版本windows下获取本地IP地址和判定某个端口是否被占用

部署运行你感兴趣的模型镜像

问题提出

某个项目中,需要获取本地ip地址,和起一个程序监听某个端口,需要获取可用的端口。网上也有一些代码,这里是修改过后的判定可用的。

代码

#include <WinSock2.h>
#include <string>
#pragma comment(lib, "Ws2_32")
using namespace std;


bool isReleasePort(unsigned short usPort)
{
    WSADATA wsData;
    ::WSAStartup(MAKEWORD(2, 2), &wsData);//起socket环境,版本号,也有 (1,1)
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(usPort);
    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    int ret = ::bind(s, (LPSOCKADDR)&addr, sizeof(addr));
    if (ret != 0)
    {
        closesocket(s);
        ::WSACleanup();
        return false;
    }
    closesocket(s);
    ::WSACleanup();
    return true;
}

bool getReleasePort(short& port)
{
    short num = 0;
    while (!isReleasePort(port) && num<30)
    {
        ++port;
        ++num;
    }
    if (num >= 30)
    {
        port = -1;
        return false;
    }
    return true;
}

bool getHostIP(string &hip)
{
    WSADATA wsData;
    ::WSAStartup(MAKEWORD(2, 2), &wsData);
    u_long ip;
    char hostname[128];
    int ret = gethostname(hostname, sizeof(hostname));
    if (ret == -1) 
    {
        std::cout << "here1" << std::endl;
        return false;
    }
    struct hostent* hent;
    hent = gethostbyname(hostname);
    if (NULL == hent) 
    {
        std::cout << "here2" << std::endl;
        return false;
    }
    //一堆地址中获取最后一个才是正确的(这个没探究过原因,不过目前测试了几台机器是可用的)
    for (size_t ii = 0; hent->h_addr_list[ii] && ii < 15; ++ii)
    {
        ip = ((struct in_addr*)hent->h_addr_list[ii])->s_addr;
        in_addr inaddr;
        inaddr.s_addr = ip;
        hip = inet_ntoa(inaddr);
    }
    if (hip.empty())
    {
        std::cout << "here3" << std::endl;
        return false;
    }
    ::WSACleanup();
    return true;
}

int main(int argc, char** argv)
{
    string ip("");
    if(getHostIP(ip))
    {
        //成功
    }
    short port = 9060;
    if(getReleasePort(port)) //在port的基础上获取一个可用的port
    {
       //成功
    }
    return 0;
}

以上

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值