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;
}

以上

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值