еще один вопрос о моих любимых сокетах. Сначала объясню, что у меня такое. После этого я расскажу вам, что меня беспокоит.Send/Recv Socket Blocking Issues
У меня есть клиент и сервер. Оба приложения написаны на C++ с реализацией winsock2. Соединение выполняется через TCP и WLAN. WLan очень важен, потому что он, вероятно, вызывает проблему и определенно станет каналом связи.
Я подключаю два разъема к серверу. SendSocket и ReceiveSocket. Я постоянно отправляю видеоданные на сервер через sendocket. Данные обрабатываются и отправляются обратно клиенту и отображаются. Каждый сокет получил свою собственную нить.
Videodata закодирован, поэтому я достигаю как 500 кБ/с. Давайте рассмотрим этот показатель как фиксированный, без объяснения причин.
Совершенная связи рассматривается клиентом:
Send Data
Recv Data
Send Data
Recv Data
...
Это для как 100 кадров случае.
Но каждая пара кадров, поток замерзает как 4 кадра и продолжает после этого. (4 кадра равны 500 мс)
Это вопрос, с которым я сталкиваюсь.
Что происходит с потоком является следующее:
Send Data
Recv Data
Send Data
Send Data
Send Data1 -> blocked send
Recv Data
Recv Data
Send Data2 -> not blocked anymore.
Паспорт получает правильно отправлен на стороне сервера.
Поскольку WLan не является дуплексом (насколько я знаю), я подумал, что посылая запросы по какой-то причине имеют приоритет. И после этого приоритеты приема приоритетны, поэтому блокировки отправки блокируются до тех пор, пока вызовы recv не будут выполнены.
Возможно, вы можете сказать мне, что происходит в нижнем слое, что может вызвать проблему. КПП. Я определенно не уверен, если это не проблема с пропускной способностью, но я думал, что WLAN должна иметь возможность обрабатывать 500 КБ/с. Этот 500kB/s одновременно и вверх, и вниз по течению. Важное замечание. Если я задаю частоту кадров в 1/5, это не устранит проблему.
Я знаю, что с этим пониманием трудно решить эту проблему. Я был бы счастлив, если бы вы могли поделиться своими знаниями, чтобы я мог сам это исправить.
EDIT: Это прекрасно, если клиент recv висит litte. Но он не должен блокировать отправку. Сервер нуждается в данных постоянно.
Как уже упоминалось ранее, я уменьшил частоту кадров до 1/5, что ничего не изменило. Таким образом, процессор должен кодировать/декодировать достаточно быстро, чтобы поддерживать прием буферов. – xeed
На самом деле буфер отправки не может быть заполнен, а сервер получает пакеты. Таким образом, должна быть другая причина, почему блоки отправки. вещь. вызов recv и send на клиенте одновременно. И это то, что вызывает блоки, как я думал. – xeed
Я иду дальше. Когда я не отправлю изображение с сервера обратно клиенту. Никакой задержки не появляется. Но когда я получаю IFrame (~ 16000Byte) с сервера, он блокирует 8! отправлять процедуры. Таким образом, 8 кадров пропускаются. Серверный вызов по-прежнему возвращается немедленно. Пока эти 8 кадров заблокированы, сервер ничего не получает и ничего не отправляет, так же как и клиент. (за исключением заблокированного приема) Эти 8 фреймов стоят 500 мс ... Вы не можете сказать мне, что требуется WLAN, которая долго доставляет 15kB ... – xeed