Почему клиент не получает отказ в соединении в случае отставания = 0? - PullRequest
0 голосов
/ 25 декабря 2018

Я играю с доменными сокетами Linux, и теперь я пришел к вопросу о том, как разбираться в отставании.Вот код на стороне сервера:

const char *const hostname = "/tmp/test_local_addr";

int sock_fd = socket(AF_LOCAL, SOCK_STREAM, 0);

struct sockaddr_un server_address;
memset(&server_address, '\0', sizeof(struct sockaddr_un));
server_address.sun_family = AF_LOCAL;
strncpy(server_address.sun_path, hostname, hostname_len + 1);
const socklen_t addrlen = offsetof(struct sockaddr_un, sun_path) + hostname_len + 1;

bind(sock_fd, (struct sockaddr*) &server_address, addrlen);

int listen_result = listen(sock_fd, 0);

Я установил размер невыполненной работы 0 в режиме прослушивания и не вызывал метод accept, поэтому я ожидал, что любой клиент получит Соединение, отказанное при попытке connect.Но когда я запускаю strace nc -U /tmp/test_local_addr с двух отдельных терминалов, у меня первый печатает

connect(3, {sa_family=AF_UNIX, sun_path="/tmp/test_local_addr"}, 110) = 0
poll([{fd=0, events=POLLIN}, {fd=3, events=0}, {fd=3, events=POLLIN}, {fd=1, events=0}], 4, -1

, а второй

--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
connect(3, {sa_family=AF_UNIX, sun_path="/tmp/test_local_addr"}, 110

Поведение мне не совсем понятно.Я ожидал, что они оба немедленно заканчиваются на Connection refused.Но

read(-1, 0x7fffc0db3740, 16384)         = -1 EBADF (Bad file descriptor)

происходит на обоих клиентах только тогда, когда я завершаю работу сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...