首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从udp-socket(C/C++)获取自己的(本地)IP地址

要从UDP套接字(C/C++)获取本地IP地址,可以使用以下步骤:

  1. 首先,需要包含必要的头文件。
代码语言:cpp
复制
#include<iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include<stdio.h>
#include <stdlib.h>
  1. 定义一个函数,用于获取本地IP地址。
代码语言:cpp
复制
void getLocalIPAddress() {
    // 初始化WSA
    WSADATA wsaData;
    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (result != 0) {
        std::cout << "WSAStartup failed: "<< result<< std::endl;
        return;
    }

    // 创建UDP套接字
    SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock == INVALID_SOCKET) {
        std::cout << "socket failed: " << WSAGetLastError()<< std::endl;
        WSACleanup();
        return;
    }

    // 设置套接字选项
    struct sockaddr_in sa;
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = htonl(INADDR_ANY);
    sa.sin_port = htons(0);

    if (bind(sock, (SOCKADDR*)&sa, sizeof(sa)) == SOCKET_ERROR) {
        std::cout << "bind failed: " << WSAGetLastError()<< std::endl;
        closesocket(sock);
        WSACleanup();
        return;
    }

    // 获取本地IP地址
    INTERFACE_INFO InterfaceList[20];
    unsigned long nBytesReturned;
    if (WSAIoctl(sock, SIO_GET_INTERFACE_LIST, NULL, 0, &InterfaceList, sizeof(InterfaceList), &nBytesReturned, NULL, NULL) == SOCKET_ERROR) {
        std::cout << "WSAIoctl failed: " << WSAGetLastError()<< std::endl;
        closesocket(sock);
        WSACleanup();
        return;
    }

    int count = nBytesReturned / sizeof(INTERFACE_INFO);
    for (int i = 0; i< count; ++i) {
        sockaddr_in *pAddress = (sockaddr_in*)&(InterfaceList[i].iiAddress);
        char ipAddress[20];
        inet_ntop(AF_INET, &(pAddress->sin_addr), ipAddress, sizeof(ipAddress));
        std::cout << "IP Address: " << ipAddress<< std::endl;
    }

    // 关闭套接字并清理WSA
    closesocket(sock);
    WSACleanup();
}
  1. 在主函数中调用getLocalIPAddress()函数。
代码语言:cpp
复制
int main() {
    getLocalIPAddress();
    return 0;
}

这样,你就可以从UDP套接字获取本地IP地址了。请注意,这个示例仅适用于Windows操作系统,并依赖于Winsock2库。如果你使用的是其他操作系统或库,请根据相应的文档进行修改。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的视频

领券