如何将sockaddr结构转换为sockaddr

如何将sockaddr结构转换为sockaddr

我正在尝试获取客户地址,但是我不确定如何将sockaddr结构转换为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);

提前致谢! :)

我发现了将我带到这一步的问题:
Getting IPV4 address from a sockaddr structure

抱歉,为了避免混淆,这是我真正的实现,其中“ci”是用于存储诸如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*’

最佳答案

我要指出的是,如果这实际上是C++,则惯用的方法是:

sockaddr *sa = ...; // struct not needed in C++
char ip[INET6_ADDRSTRLEN] = {0};

switch (sa->sa_family) {
  case AF_INET: {
    // use of reinterpret_cast preferred to C style cast
    sockaddr_in *sin = reinterpret_cast<sockaddr_in*>(sa);
    inet_ntop(AF_INET, &sin->sin_addr, ip, INET6_ADDRSTRLEN);
    break;
  }
  case AF_INET6: {
    sockaddr_in6 *sin = reinterpret_cast<sockaddr_in6*>(sa);
    // inet_ntoa should be considered deprecated
    inet_ntop(AF_INET6, &sin->sin6_addr, ip, INET6_ADDRSTRLEN);
    break;
  }
  default:
    abort();
}

此示例代码处理IPv4和IPv6地址,并且比任何一种建议的实现方式都被视为C++惯用的。

关于c++ - 如何将sockaddr结构转换为sockaddr_in-C++网络套接字ubuntu UDP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11684008/

10-09 19:32