перехват выхода клиента с сервера при программировании сокета - PullRequest
1 голос
/ 09 мая 2020

Мне нужно некоторое представление об обработке ошибок сокетов в C ++ (или c). Я тестирую простую клиентскую и серверную программу, например:

 .....
 while (1) { // server keeps sending strings to client
     sprintf(jsonStr, "{ \"%d: Hello\": \"world!\" } \n", index++);
     size = send(newsockfd, jsonStr, strlen(jsonStr), 0);
     if (size == -1) {
       error("ERROR on send");
     }
     sleep(1);
 }
 .....

Пока клиент получает строки с сервера, если я убью клиента, сервер также завершит работу без какого-либо сообщения. Ожидается ли это? Как мне его поймать, а не выйти? Я пробовал «попробовать» и «поймать», но не смог. С java я получаю SocketException "Broken pipe", используя DataOutputStream.writeUTF (). Я тестировал Ma c и Linux, и их результаты были одинаковыми.

Я использую примеры кодов из: https://www.bogotobogo.com/cplusplus/sockets_server_client.php

Заранее спасибо.

1 Ответ

0 голосов
/ 09 мая 2020

Попытка отправить через сломанный сокет вызовет сигнал SIGPIPE. Поведение по умолчанию при получении SIGPIPE - завершить процесс (это поведение, которое вы наблюдаете).

Вы можете исправить это следующим образом:

  • Игнорирование сигнала (работает на любом platform)
  • Установка параметра сокета SO_NOSIGPIPE (только Mac / BSD)
  • Передача флага MSG_NOSIGNAL для отправки (только Linux)

send должен затем вернуть -1 с errno, установленным в EPIPE, если запись выполняется на сломанном сокете.

Дополнительные сведения об обработке SIGPIPE см .:

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