我是套接字编程的新手。创建了一个带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_path
开始的两个字节是0
- 当然这不能是一个有效的地址可以它?
我知道socketpair()
会创建一对&#34;未命名的&#34;套接字 - 但我认为一个&#34;未命名的套接字&#34;只是一个抽象的命名空间,它仍然是一些独特的非空字符串。
有人可以解释为什么这段代码会输出观察到的看似无效的命名空间吗?