getsockname () возвращает неверно выглядящее имя

Я новичок в программировании сокетов. Создав пару сокетов с 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() создает пару «неназванных» сокетов — но я думал, что «неназванный сокет» просто означал абстрактное пространство имен, которое по-прежнему было некоторой уникальной, ненулевой его строкой.

Может кто-нибудь объяснить, почему этот код выводит наблюдаемое некорректно выглядящее пространство имен?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]