首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从udp套接字(C/C++)获取自己的(本地)IP地址

如何从udp套接字(C/C++)获取自己的(本地)IP地址
EN

Stack Overflow用户
提问于 2008-08-27 10:54:29
回答 5查看 17.2K关注 0票数 11
  1. 您有多个网络适配器。
  2. 将UDP套接字绑定到本地端口,而不指定地址。
  3. 在其中一个适配器上接收数据包。

如何获得接收数据包的适配器的本地ip地址?

问题是,“接收方适配器的ip地址是什么?”而不是我们从发件人那里得到的地址

代码语言:javascript
运行
复制
receive_from( ..., &senderAddr, ... );

打电话。

EN

Stack Overflow用户

发布于 2020-09-02 04:43:04

在Linux环境中,您可以使用recvmsg获取本地ip地址。

代码语言:javascript
运行
复制
    //create socket and bind to local address:INADDR_ANY:
    int s = socket(PF_INET,SOCK_DGRAM,0);
    bind(s,(struct sockaddr *)&myAddr,sizeof(myAddr)) ;
    // set option
    int onFlag=1;
    int ret = setsockopt(s,IPPROTO_IP,IP_PKTINFO,&onFlag,sizeof(onFlag));
    // prepare buffers
    // receive data buffer
    char dataBuf[1024] ;
    struct iovec iov = {
        .iov_base=dataBuf,
        .iov_len=sizeof(dataBuf)
    } ;
    // control buffer
    char cBuf[1024] ;
    // message
    struct msghdr  msg = {
        .msg_name=NULL, // to receive peer addr with struct sockaddr_in
        .msg_namelen=0, // sizeof(struct sockaddr_in)
        .msg_iov=&iov,
        .msg_iovlen=1,
        .msg_control=cBuf,
        .msg_controllen=sizeof(cBuf)
    } ;
    while(1) {
        // reset buffers
        msg.msg_iov[0].iov_base = dataBuf ;
        msg.msg_iov[0].iov_len = sizeof(dataBuf) ;
        msg.msg_control = cBuf ;
        msg.msg_controllen = sizeof(cBuf) ;
        // receive
        recvmsg(s,&msg,0);
        for( struct cmsghdr* pcmsg=CMSG_FIRSTHDR(&msg);
             pcmsg!=NULL; pcmsg=CMSG_NXTHDR(&msg,pcmsg) ) {
            if(pcmsg->cmsg_level==IPPROTO_IP && pcmsg->cmsg_type==IP_PKTINFO) {
                struct in_pktinfo * pktinfo=(struct in_pktinfo *)CMSG_DATA(pcmsg);
                printf("ifindex=%d ip=%s\n", pktinfo->ipi_ifindex, inet_ntoa(pktinfo->ipi_addr)) ;
            }
        }
    }

以下内容不适用于非对称路由环境。

您可以首先将SO_REUSEADDR设置为true。

代码语言:javascript
运行
复制
BOOL bOptVal = 1;
setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&boOptVal, sizeof(bOptVal));

receive_from( ..., &remoteAddr, ... );之后创建另一个套接字,并连接回remoteAddr。然后调用getsockname可以获得ip地址。

代码语言:javascript
运行
复制
SOCKET skNew = socket( )
// Same local address and port as that of your first socket 
// INADDR_ANY
bind(skNew, ,  )
// set SO_REUSEADDR to true again
setsockopt(skNew, SOL_SOCKET, SO_REUSEADDR, (char *)&boOptVal, sizeof(bOptVal));

// connect back  
connect(skNew, remoteAddr)

// get local address of the socket
getsocketname(skNew, )
票数 0
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档