Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

blocking ClientSocket, глюк или я чего-то не догоняю

1.7K
30 марта 2006 года
ilyes
181 / / 22.02.2006
Здравствуйте!

Уже не раз задавал вопросы про Сокеты.
Короче, есть многопоточный сервер обрабатывающий запросы, посылающий и принимающий файлы. И есть клиент, умеющий посылать разные запросы, принимать и сохранять файлы.

Проблема с клиентом вот в чем:
Когда он принимает файл то он виснет пока не докачает его. А когда посылает обратно то все ок, не виснет. Мне уже советовали вынести принятие файла в отдельный поток, но слижком много переделовать придется, неужели нет другого решения, по проще.

Код:
...
TWinSocketStream *pStream = new TWinSocketStream
(Socket, CLIENTWAITTIME);
...
Принятие файла:
...
while (!flag)
if (pStream->WaitForData(CLIENTWAITTIME))
{
int CurrentBufSize = pStream->Read(buffer, sizeof(buffer));
if (CurrentBufSize != 0)
{
FileSize += CurrentBufSize;
Application->ProcessMessages();
pSecondBuffer->WriteBuffer(buffer,CurrentBufSize);
}
else flag = true;
}
else flag = true;
...
Отправение:
...
TFileStream *lfs;
lfs = new TFileStream(localFilePath+filePhysicalName, fmOpenRead);
char *file = new char[lfs->Size];
lfs->ReadBuffer(file,lfs->Size);
pStream->Write(file,lfs->Size);
lfs->Free();
...

Спасибо!
8.8K
04 апреля 2006 года
The_Ice
109 / / 04.04.2006
Цитата:
Originally posted by ilyes
Здравствуйте!

Уже не раз задавал вопросы про Сокеты.
Короче, есть многопоточный сервер обрабатывающий запросы, посылающий и принимающий файлы. И есть клиент, умеющий посылать разные запросы, принимать и сохранять файлы.

Проблема с клиентом вот в чем:
Когда он принимает файл то он виснет пока не докачает его. А когда посылает обратно то все ок, не виснет. Мне уже советовали вынести принятие файла в отдельный поток, но слижком много переделовать придется, неужели нет другого решения, по проще.

Код:
...
TWinSocketStream *pStream = new TWinSocketStream
(Socket, CLIENTWAITTIME);
...
Принятие файла:
...
while (!flag)
if (pStream->WaitForData(CLIENTWAITTIME))
{
int CurrentBufSize = pStream->Read(buffer, sizeof(buffer));
if (CurrentBufSize != 0)
{
FileSize += CurrentBufSize;
Application->ProcessMessages();
pSecondBuffer->WriteBuffer(buffer,CurrentBufSize);
}
else flag = true;
}
else flag = true;
...
Отправение:
...
TFileStream *lfs;
lfs = new TFileStream(localFilePath+filePhysicalName, fmOpenRead);
char *file = new char[lfs->Size];
lfs->ReadBuffer(file,lfs->Size);
pStream->Write(file,lfs->Size);
lfs->Free();
...

Спасибо!


на самом деле вынести в отдельный поток - это и есть самое простое решение - а как ты иначе хочешь реализовать "парралельные" операции нормальной (!) обработки событий (а не всякими принудительными ProcessMessages'ами) и приема файла...

1.7K
05 апреля 2006 года
ilyes
181 / / 22.02.2006
Цитата:
Originally posted by The_Ice
на самом деле вынести в отдельный поток - это и есть самое простое решение - а как ты иначе хочешь реализовать "парралельные" операции нормальной (!) обработки событий (а не всякими принудительными ProcessMessages'ами) и приема файла...



Да, уже сделал с потоками, ничего сложного конечно. Просто я подумал если при обратной отправке файла прога не зависает, то должен бы быть способ чтобы и при принятии файла прога не висла (ну типа какую-нибудь "галочку" убрать или поставить). Согласитесь одну переменную поставить в true легче чем новый класс обьявить.

Но меня до сих пор волнует этот вопрос: "Почему прога виснет при принятии и не виснет при отправлении? (без использования потоков) "

8.8K
06 апреля 2006 года
The_Ice
109 / / 04.04.2006
Цитата:
Originally posted by ilyes
Да, уже сделал с потоками, ничего сложного конечно. Просто я подумал если при обратной отправке файла прога не зависает, то должен бы быть способ чтобы и при принятии файла прога не висла (ну типа какую-нибудь "галочку" убрать или поставить). Согласитесь одну переменную поставить в true легче чем новый класс обьявить.

Но меня до сих пор волнует этот вопрос: "Почему прога виснет при принятии и не виснет при отправлении? (без использования потоков) "

ну это смотря что куда поставить :) да и класс создавать не обязательно - CreateThread и все :)

8.7K
06 апреля 2006 года
Rubicon
55 / / 28.10.2005
Цитата:
Originally posted by ilyes

Но меня до сих пор волнует этот вопрос: "Почему прога виснет при принятии и не виснет при отправлении? (без использования потоков) "


Насколько я помню примудрости TCP/IP (у меня была 4 по сетям - строго не судить), дело в следующем:
у тебя цикл, что само по себе прямая дорога к временному "подвисанию" проги. Перед чтением ты (возможно, что на каждом проходе, это надо больше кода видеть) "ждешь" CLIENTWAITTIME милисекунд. Все это дает задержку. А запись происходит так быстро потому, что реализация протокола предусматривает буфер, в который помещается посылаемая инфа (точно не знаю, фиксированный он или нет), и Write(...) возвращет сразу после помещения в буфер (механизм гарантированной доставки реализуется "прозрасно"). Поэтому отправка происходжит без задержек.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог