如何将sockaddr结构转换为sockaddr_in - C ++网络套接字ubuntu UDP [英] how do you cast sockaddr structure to a sockaddr_in - C++ networking sockets ubuntu UDP

查看:504
本文介绍了如何将sockaddr结构转换为sockaddr_in - C ++网络套接字ubuntu UDP的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想获得客户端地址,但是我不确定如何将sockaddr结构转换为sockaddr_in?

I am trying to get the client address, but i am unsure how do i cast the sockaddr structure to sockaddr_in?

struct sockaddr_in cliAddr, servAddr;

    n = recvfrom(sd, msg, MAX_MSG, 0,(struct sockaddr *) cliAddr,sizeof(cliAddr));

 //i tried this but it does not work
    struct sockaddr cliSockAddr = (struct sockaddr *) cliAddr; 
    char *ip = inet_ntoa(cliSockAddr.sin_addr);

提前感谢! :)

我发现了让我进入这一步的问题:
从sockaddr结构获取IPV4地址

i've found questions that brought me to this step: Getting IPV4 address from a sockaddr structure

对不起,为了避免混淆,这是我真正的实现,其中ci是存储指针的对象,如sockaddr_in。

Sorry to avoid confusion, this is my real implementation where "ci" is an object to store pointers such as sockaddr_in.

    /* receive message */
    n = recvfrom(*(ci->getSd()), msg, MAX_MSG, 0,(struct sockaddr *) ci->getCliAddr(),ci->getCliLen());

    char *ip = inet_ntoa(ci->getCliAddr().sin_addr);

我会收到以下错误:

udpserv.cpp:166: error: request for member ‘sin_addr’ in ‘ci->clientInfo::getCliAddr()’, which is of non-class type ‘sockaddr_in*’


推荐答案

其实很简单!

struct sockaddr *sa = ...;

if (sa->sa_family == AF_INET)
{
    struct sockaddr_in *sin = (struct sockaddr_in *) sa;
    ip = inet_ntoa(sin->sin_addr);
}

这篇关于如何将sockaddr结构转换为sockaddr_in - C ++网络套接字ubuntu UDP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆