Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TWinSocketStream


Unknown user ©   (2008-12-15 18:39:00) 

Добрый вечер. подскажите пожалуйста, нет ли ошибок в следующем коде.


Stream := TWinSocketStream.Create(ClientSocket, 60000);
//запрос GET серверу
if Stream.WaitForData(60000) then Stream.Write(Buffer, BufSize);
//получение ответа от сервера
if Stream.WaitForData(60000) then Stream.Read(Buffer, BufSize);


Вопрос в том, можно ли писать в TWinSocketStream и сразу же ожидать от него ответа? Не надо ли выполнять повторное подключение перед получением данных?


Сергей М.   (2009-02-13 10:28:00) [1]


> фрагмент HTTP заголовка, возвращаемого сервером.
>
> HTTP/1.1 200 OK
> Connection: close


Так ведь этот заголовок-ответ ты все равно получить должен как результат поста, даже если сразу за отправкой ответа сервер рвет соединение ..


Unknown user   (2009-02-13 00:52:00) [2]

Кажется я понял причину, сервер после загрузки файла закрывает соединение, вот фрагмент HTTP заголовка, возвращаемого сервером.

HTTP/1.1 200 OK
Connection: close


Странно, файлы небольшие по 6К, раньше такого не было когда использовал асинхронные сокеты. В запросе указываю Proxy-Connection: Keep-Alive. Может можно как-то уговорить сервер не разрывать так часто (каждые 1-2 сек) соединение?


Unknown user   (2009-02-13 00:09:00) [3]

>Read may return 0 if the socket connection is extremely slow and the read operation has not completed after TimeOut milliseconds.

тут написано, что Read может возвращать 0, при очень медленных соединениях, если операция чтения не была завершена в течении указанного таймаута. У меня Read возвращает 0 фактически сразу, тайм аут не выдерживается. Пробовал также и размер буфера уменьшать - не помогает.


Сергей М.   (2009-02-12 13:14:00) [4]


>   if not Strm.WaitForData(5000) then
>     begin
>      //неудачная попытка
>       Disconnect(True); Break;
>     end;
>


А почему сразу лапки кверху ?

Ну не пришел ответ через 5 секунд, а, например, через еще одну секунду придет .. а ты его так и не дождался ..


> в задержках которые вызывает прокси


Да мало ли что еще может вызвать задержки !
Если тебе действительно нужен ответ - жди его пока не придет.
А у тебя терпение лопается уже через 5 секунд)


Сергей М.   (2009-02-12 13:06:00) [5]

Ответ дает все та же справка:

Read may return 0 if the socket connection is extremely slow and the read operation has not completed after TimeOut milliseconds. This ensures that the Read method does not hang indefinitely when a problem occurs with the socket connection.

To guard against the Read method timing out because of a slow connection, set Count fairly low, and make several calls to Read, rather than fewer calls with a large value of Count


Unknown user   (2009-02-12 12:55:00) [6]

Помогите пожалуйста со следующим кодом. Здесь используется сокет в блокируещем режиме и Strm:TWinSocketStream. Код работает, однако при чтении из потока Bytes частооказывается равен 0. При чем Strm.WaitForData перед этим вовзращает True.

   //отправляем запрос серверу
   if not FSocket.Active then Continue;
   try
    if Strm.Write(Pointer(S)^, Length(S))<> Length(S) then raise     ESocketError.Create('');
   except
    //неудачная попытка
    Disconnect(True); Continue;
   end;

    //подготовка к получению данных
    if not Strm.WaitForData(5000) then
    begin
     //неудачная попытка
     Disconnect(True); Break;
    end;

    try
     Bytes:=Strm.Read(Buf,Size);
     if Bytes=0 then raise ESocketError.Create('');
    except
     Disconnect(True); Break;
    end;


Заметил такую особенность. Если подключатся к серверу не напрямую, а через прокси, то Strm.Read фактически никогд не возвращает 0. Все работает отлично. Сделал вывод, что дело в задержках которые вызывает прокси, но вставка Sleep в разные участки кода результата не принесло. Посоветуйте?


Сергей М.   (2008-12-15 19:18:00) [7]


> нет ли ошибок в следующем коде


Есть.

1. Запись в стрим не требует никакого ожидания.
2. Методы стрима Read и Write являются функциональными, что подразумевает получение и анализ результатов их вызовов.


> можно ли писать


Можно.


> Не надо ли


Не надо.


Наверх

Титульная страница Поиск, карта сайта Написать письмо