Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 05.07.2014, 15:17   #1
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
Репутация: 16
Вопрос Клиент не получает данные с сервера

Здравствуйте.

Есть 2 клиента и сервер, всё запускаю на одном компе. Клиентами авторизируюсь, обмениваюсь данными между двумя клиентами с помощью сервера и начинается загрузка графики, которая длится около минуты. После загрузки графики бывают проблемы. Бывает что один или сразу оба клиента не получают данные отправленные сервером, а бывает что всё работает как надо. То есть, графика загрузилась и сервер начинает каждые 5 секунд слать данные обоим клиентам, клиент ВАРИАНТ1 либо вообще (по непонятной мне причине) не получает ни одного сообщения с сервера, ВАРИАНТ2 либо получает всё (работает как надо) что отправляет сервер. С сервера данные отправляются.

Подскажите пожалуйста, как можно выяснить в чём проблема? Что проверить? Уже целый день мучаюсь, не могу понять в чём дело.

Ожидание ответа от сервера у меня происходит в отдельном потоке
Код:

unsigned int resultRecv;
char buf[4096];
resultRecv = SDLNet_TCP_Recv(sock, (char *) buf, 4096);
if(resultRecv > 0)
{
.......
}
else
{
....
}

В случае ВАРИАНТА1 он не возвращает не труе и не фалсе, а просто безконечно висит. Сам поток работает проблема начинается после resultRecv = SDLNet_TCP_Recv(sock, (char *) buf, 4096);

Спасибо за внимание.

Последний раз редактировалось gunsoy; 05.07.2014 в 15:19.
gunsoy вне форума   Ответить с цитированием
Старый 05.07.2014, 15:59   #2
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,957
Репутация: 6832
По умолчанию

Цитата:
resultRecv = SDLNet_TCP_Recv(sock, (char *) buf, 4096);
А это в цикле делается? Поставь проверку на resultRecv < 4096, ведь не обязательно посылаемая информация будет кратна этому числу, и если меньше - значит пришли последние пакеты данных, и нужно заканчивать прием.
__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 05.07.2014, 17:02   #3
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,512
Репутация: 1686
По умолчанию

А где здесь цикл вообще?
Если зависает внутри SDLNet_TCP_Recv() то это значит, что на этот сокет не приходят данные, т.е. их никто не посылает.
waleri вне форума   Ответить с цитированием
Старый 05.07.2014, 17:20   #4
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
Репутация: 16
По умолчанию

А где здесь цикл вообще?

Да, у меня это делается в цикле.

Если зависает внутри SDLNet_TCP_Recv() то это значит, что на этот сокет не приходят данные, т.е. их никто не посылает.

Да, данные не приходят, но сервер их посылает, проверял.

Как бы выяснить в чём проблема? Мне в голову ничего не приходит. Какая-то странная проблема=( То работает, то не работает. В основном один из двух клиентов данные не принимает в 50% случаев. В 25% не принимают данные оба клиента и в 25% принимают данные оба клиента.
gunsoy вне форума   Ответить с цитированием
Старый 05.07.2014, 19:36   #5
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,957
Репутация: 6832
По умолчанию

Цитата:
Как бы выяснить в чём проблема?
Сниффером конечно. Если данные придут снифф их увидит.
__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 05.07.2014, 21:30   #6
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,512
Репутация: 1686
По умолчанию

А как вы проверяли, что сервер их посылал?
waleri вне форума   Ответить с цитированием
Старый 05.07.2014, 21:45   #7
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
Репутация: 16
По умолчанию

А как вы проверяли, что сервер их посылал?

Сделал вывод std::cout на сервере, примерно так

for(int i = 0; i < UserCol; i++)
{
resultSend = send(usersock[i].....);
if(resultSend)
{
std::cout << "\nTrue " << i;
}
}

Сервер возвращал труе 0 и труе 1, а один из клиентов данные не получал.

Скачал сниффер, попробую с ним. Осталось только разобраться как с ним работать.
gunsoy вне форума   Ответить с цитированием
Старый 06.07.2014, 10:19   #8
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,512
Репутация: 1686
По умолчанию

а что напечатает ваша проверка, если send вернет -1?
waleri вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клиент запрашивает список файлов в текущем каталоге сервера canela Помощь студентам 0 04.06.2013 13:00
Передача произвольного потока с сервера на клиент datasnap galamay-evg Помощь студентам 0 15.02.2011 14:43
Как перехватить данные, которые отправляет на сервер и получает от него? losticsx Помощь студентам 2 21.08.2010 18:23
клиент не получает сообщение(winsock) NiCola999 C/C++ Сетевое программирование 4 21.07.2010 12:08
обновление в блоге - Создание клиент-сервера Pblog Обсуждение статей 0 03.10.2007 17:12


20:33.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru