Я запускаю клиент и сервер на одной машине, используя петлевой адрес для изучения, но мой «серверный» код, похоже, вылетает назад listen (), а затем зависает на моем connect (). Требуется ли, чтобы listen () находился в бесконечном цикле, чтобы продолжать получать соединения?
Как определить, что соединение установлено / находится в очереди, если listen () возвращает 0, даже если я еще не установил соединение?
У меня следующий вызов accept (), но код зависает на этом месте. Я имею отладочные операторы прямо до и после, и он никогда не проходит мимо accept ().
С другой стороны, мой клиентский код, кажется, прекрасно подключается () (не выдает ошибку) и, кажется, пишет и завершает работу, даже если серверный код никогда не получает соединение.
listen
Функция определяет отставание. Нужно только один раз позвонить.
Тогда используйте accept
получить входящее соединение. Лучше всего разобраться с этим быстро и обойти еще раз для другого accept
,
И то и другое connect()
а также accept()
следует заблокировать во время ожидания соединения.
connect() #client blocks while waiting for remote server to answer
accept() #server blocks while waiting for a client
listen()
не должен блокировать вообще. Он говорит ОС выделять дополнительную память для запросов, чтобы ОС могла ставить в очередь клиентов, которые приходят одновременно. Вам нужно позвонить только один раз.
Если accept()
никогда не завершается на сервере, то, скорее всего, у вас никогда не будет соединения. Если connect()
вызов завершается в вашем клиенте, затем вам нужно проверить его возвращаемое значение. Если он возвращается с -1, то соединение не удалось. Похоже, это наиболее вероятно, что происходит. Вы все еще можете писать в сокет без подключения, но ваше сообщение никуда не денется.