Функция listen () работает непрерывно или мне нужно выполнить ее зацикливание, чтобы продолжать получать соединения через сокет?

Я запускаю клиент и сервер на одной машине, используя петлевой адрес для изучения, но мой «серверный» код, похоже, вылетает назад listen (), а затем зависает на моем connect (). Требуется ли, чтобы listen () находился в бесконечном цикле, чтобы продолжать получать соединения?

Как определить, что соединение установлено / находится в очереди, если listen () возвращает 0, даже если я еще не установил соединение?

У меня следующий вызов accept (), но код зависает на этом месте. Я имею отладочные операторы прямо до и после, и он никогда не проходит мимо accept ().

С другой стороны, мой клиентский код, кажется, прекрасно подключается () (не выдает ошибку) и, кажется, пишет и завершает работу, даже если серверный код никогда не получает соединение.

1

Решение

listen Функция определяет отставание. Нужно только один раз позвонить.

Тогда используйте accept получить входящее соединение. Лучше всего разобраться с этим быстро и обойти еще раз для другого accept,

4

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

И то и другое connect() а также accept() следует заблокировать во время ожидания соединения.

   connect()  #client blocks while waiting for remote server to answer
accept()   #server blocks while waiting for a client

listen() не должен блокировать вообще. Он говорит ОС выделять дополнительную память для запросов, чтобы ОС могла ставить в очередь клиентов, которые приходят одновременно. Вам нужно позвонить только один раз.

Если accept() никогда не завершается на сервере, то, скорее всего, у вас никогда не будет соединения. Если connect() вызов завершается в вашем клиенте, затем вам нужно проверить его возвращаемое значение. Если он возвращается с -1, то соединение не удалось. Похоже, это наиболее вероятно, что происходит. Вы все еще можете писать в сокет без подключения, но ваше сообщение никуда не денется.

2

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