Подключение к серверу TCP через C - PullRequest
0 голосов
/ 29 мая 2020

Мне нужно кое-что уточнить. Я создаю программу TCP сервер / клиент в C.

Что произойдет, если клиент попытается подключиться (с помощью connect ()), когда сервер не застрял в accept ()? Я имею в виду, когда он занят? Что возвращает connect ()?

EDIT:

Я нахожусь в среде Linux.

if (connect(...) < 0) {
    // ERROR AND LEAVE
}

Это то, что я делаю в своем клиенте. Из того, что я прочитал и узнал, если сервер занят и не принимает, connect () должен немного подождать, а затем вернуть -1, если сервер все еще занят. Это правильно?

Если да, то как мне избежать этого «маленького кусочка»? Я хочу, чтобы он сразу вернул -1.

1 Ответ

1 голос
/ 29 мая 2020

Из того, что я прочитал и узнал, если сервер занят и не принимает, connect () должен немного подождать, а затем вернуть -1, если сервер все еще занят. Правильно?

Принятие TCP-соединения, то есть TCP-рукопожатие, полностью выполняется в ядре ОС независимо от вызова accept. accept просто возвращает уже принятые соединения в пространство пользователя. Таким образом, даже если сервер в настоящее время занят, соединение будет успешным, пока в очереди ожидания есть место. Размер ожидающей очереди установлен с помощью listen. Если ожидающая очередь заполнена, поскольку приложение не извлекало из нее принятые соединения в течение некоторого времени, но клиенты все еще были подключены, тогда ОС сервера отклонит попытку подключения, т.е. connect завершится ошибкой.

...