Во избежание ошибки соединения отказано для нескольких сокетов в C - PullRequest
2 голосов
/ 21 августа 2011

Просто быстрый фон.Я готов открыть два сокета для каждого потока приложения. Основной поток имеет вызов accept () для принятия соединения TCP.Есть три других потока, и все они также имеют accept ().Иногда проблема заключается в многопоточной среде, клиент пытается подключиться до вызова сервера на приеме в дочернем потоке, что приводит к ошибке «отказано в соединении».Клиент не знает, когда сервер готов к подключению. Я не хочу, чтобы сокет основного потока отправлял клиенту какую-либо управляющую информацию, например «Теперь вы можете подключиться к серверу».Чтобы избежать этого, у меня на уме два подхода: 1. Установить максимальный счетчик (попытку) на стороне клиента, чтобы соединиться с сервером, прежде чем выход с соединением отклонил ошибку.2. Отдельный поток, единственная функция которого - принимать соединения на стороне сервера в качестве общей функции принятия для всех потоковых соединений, кроме основного потока.

Было бы очень полезно узнать, существует ли какой-либо другой подход.Спасибо

1 Ответ

1 голос
/ 13 октября 2011

В соединении отказано не потому, что вы звоните, принимаете поздно, а потому, что вы звоните, слушаете поздно. Убедитесь, что вы звоните прослушивать, прежде чем любые вызовы подключения (вы можете проверить с помощью strace). Это, вероятно, требует, чтобы вы слушали, прежде чем вырастить каких-либо детей.

После вызова прослушивания на сокете входящие соединения будут стоять в очереди до тех пор, пока вы не вызовете accept. В какой-то момент еще не принятые соединения могут быть сброшены, но это не должно происходить только с 2 или 3 сокетами.

Если это Unix, вы можете просто использовать pipe2 или socketpair, чтобы создать пару соединенных сокетов pipe / unix domain с намного меньшим количеством кода. Конечно, вам нужно сделать это, прежде чем порождать дочерний поток и передать один конец дочернему потоку.

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