如何将sockaddr结构转换为sockaddr_in - C++网络套接字ubuntu UDP

mis*_*ter 10 c++ sockets ubuntu networking client

我想获取客户端地址,但我不确定如何将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);
Run Code Online (Sandbox Code Playgroud)

提前致谢!:)


我发现问题让我走到了这一步: 从sockaddr结构中获取IPV4地址


很抱歉为了避免混淆,这是我真正的实现,其中"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);
Run Code Online (Sandbox Code Playgroud)

我会收到以下错误:

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

bma*_*eny 25

我想指出,如果这实际上是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();
}
Run Code Online (Sandbox Code Playgroud)

此示例代码处理IPv4和IPv6地址,并且还被认为比任何建议的实现都更加C++惯用.


Som*_*ude 16

它实际上非常简单!

struct sockaddr *sa = ...;

if (sa->sa_family == AF_INET)
{
    struct sockaddr_in *sin = (struct sockaddr_in *) sa;
    ip = inet_ntoa(sin->sin_addr);
}
Run Code Online (Sandbox Code Playgroud)

  • 当你这样做时,通过检查AF_INET6使你的程序支持IPv6.;) (3认同)
  • 我知道这是一个旧线程,但为了正确起见,@ bmatheny的答案是正确的,因为这个问题被标记为"C++".`reinterpret_cast <sockaddr_in*>(sa)`是转换这两种类型的正确方法,虽然旧的C转换仍然有效,但它太模糊,不会让任何读者清楚意图. (3认同)