0

我是套接字编程的新手。在创建了一个套接字对socketpair()之后,我想研究套接字绑定到的地址。但是当我尝试用 来确定这一点时getsockname(),我得到了一个看起来无效的结果。

编码:

#include <iostream>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdint.h>

int identifysock( int sd )
{
  std::ios_base::fmtflags mask = std::cout.flags();
  int ret_val = 0;
  std::cout << " === SD " << sd << " ===" << std::endl;
  struct sockaddr_un su;
  socklen_t addrlen = sizeof( sockaddr_un );
  std::cout << "before getsockname() addrlen == " << addrlen << std::endl;
  memset( &su, 0, sizeof( sockaddr_un ) );
  if ( getsockname( sd, (sockaddr*)&su, &addrlen ) )
  {
    std::cout << "Error" << std::endl;
    ret_val = 1;
  }
  else
  {
    std::cout << "after getsockname() addrlen == " << addrlen << " name == " << su.sun_path << std::endl;
    std::cout << std::showbase << std::hex << (uint32_t)su.sun_path[0] << " " << (uint32_t)su.sun_path[1] << std::endl;
  }
  std::cout.flags(mask);
  return ret_val;
}

int main( int argc, char* argv[] )
{
  int sd[2];
  if ( socketpair( AF_LOCAL, SOCK_STREAM, 0, sd ) )
  {
    std::cout << "Error" << std::endl;
    return 1;
  }
  std::cout << "sd[ 0 ] == " << sd[ 0 ] << std::endl;
  std::cout << "sd[ 1 ] == " << sd[ 1 ] << std::endl;
  if ( identifysock( sd[ 0 ] ) )
  {
    return 1;
  }
  if ( identifysock( sd[ 1 ] ) )
  {
    return 1;
  }
  return 0;
}

输出:

>g++ -g main.cpp
>./a.out
sd[ 0 ] == 3
sd[ 1 ] == 4
 === SD 3 ===
before getsockname() addrlen == 110
after getsockname() addrlen == 2 name == 
0 0
 === SD 4 ===
before getsockname() addrlen == 110
after getsockname() addrlen == 2 name == 
0 0

根据我的理解,getsockname()它告诉我应该有一个长度为 2 的地址。但是开始的两个字节su.sun_path0- 这肯定不是一个有效的地址,可以吗?

我知道这socketpair()会创建一对“未命名的”套接字——但我认为“未命名的套接字”只是意味着一个抽象的命名空间,它仍然是一些唯一的、非 NULL 字符串。

有人可以解释为什么这段代码会输出观察到的看起来无效的命名空间吗?

4

0 回答 0