首页
学习
活动
专区
工具
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库。如果你使用的是其他操作系统或库,请根据相应的文档进行修改。

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

相关·内容

  • 17 . Go之网络编程

    IP地址实际上是一个32位整数(称为IPv4),以字符串表示的IP地址如`192.168.0.1`实际上是把32位整数按8位分组后的数字表示,目的是便于阅读。 IPv6地址实际上是一个128位整数,它是目前使用的IPv4的升级版,以字符串表示类似于`2001:0db8:85a3:0042:1000:8a2e:0370:7334`。 TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。 许多常用的更高级的协议都是建立在TCP协议基础上的,比如用于浏览器的HTTP协议、发送邮件的SMTP协议等。 一个TCP报文除了包含要传输的数据外,还包含源IP地址和目标IP地址,源端口和目标端口。 端口有什么作用?在两台计算机通信时,只发IP地址是不够的,因为同一台计算机上跑着多个网络程序。一个TCP报文来了之后,到底是交给浏览器还是QQ,就需要端口号来区分。每个网络程序都向操作系统申请唯一的端口号,这样,两个进程在两台计算机之间建立网络连接就需要各自的IP地址和各自的端口号。 一个进程也可能与多个计算机建立链接,因此他会申请很多端口. ​ 了解了TCP/IP协议的基本概念,IP地址和端口的概念,我们就可以开始进行网络编程了。

    05
    领券