2013-09-27 3 views
0

еще один вопрос о моих любимых сокетах. Сначала объясню, что у меня такое. После этого я расскажу вам, что меня беспокоит.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. Но он не должен блокировать отправку. Сервер нуждается в данных постоянно.

ответ

0

Хорошо. Это была определенно проблема wlan. Я тестировал университетский университет в университете. Я не знаю, если кто-нибудь это знает.Теперь я тестировал его с помощью простого маршрутизатора, и он работал нормально. Похоже, что у eduroam wlan есть некоторые проблемы с изменением полосы пропускания или направления. Я не буду смотреть на это ...

1

Блокированная передача означает, что буфер отправки сокета заполнен, что означает: (а) что буфер приемника сокета на приемнике заполнен, что означает, что приемник не читает так быстро, как вы отправляете; или (b) что есть сетевые потери, которые заставляют отправителя повторить попытку. В любом случае вы ничего не можете с этим поделать в отправной части.

Кто-то обязательно должен указать неблокирующий ввод-вывод в качестве решения, но это не так: в точке, где блокирует отправитель, неблокирующий отправитель получит -1 из send() witch 'errno == EAGAIN/EWOULDBLOCK ', который вообще не решает проблему.

+0

Как уже упоминалось ранее, я уменьшил частоту кадров до 1/5, что ничего не изменило. Таким образом, процессор должен кодировать/декодировать достаточно быстро, чтобы поддерживать прием буферов. – xeed

+0

На самом деле буфер отправки не может быть заполнен, а сервер получает пакеты. Таким образом, должна быть другая причина, почему блоки отправки. вещь. вызов recv и send на клиенте одновременно. И это то, что вызывает блоки, как я думал. – xeed

+0

Я иду дальше. Когда я не отправлю изображение с сервера обратно клиенту. Никакой задержки не появляется. Но когда я получаю IFrame (~ 16000Byte) с сервера, он блокирует 8! отправлять процедуры. Таким образом, 8 кадров пропускаются. Серверный вызов по-прежнему возвращается немедленно. Пока эти 8 кадров заблокированы, сервер ничего не получает и ничего не отправляет, так же как и клиент. (за исключением заблокированного приема) Эти 8 фреймов стоят 500 мс ... Вы не можете сказать мне, что требуется WLAN, которая долго доставляет 15kB ... – xeed