Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2011.02.13;
Скачать: [xml.tar.bz2];

Вниз

TWinSocketStream   Найти похожие ветки 

 
Unknown user   (2008-12-15 18:39) [0]

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


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 и сразу же ожидать от него ответа? Не надо ли выполнять повторное подключение перед получением данных?


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


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


Есть.

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


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


Можно.


> Не надо ли


Не надо.


 
Unknown user ©   (2009-02-12 12:55) [2]

Помогите пожалуйста со следующим кодом. Здесь используется сокет в блокируещем режиме и 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 в разные участки кода результата не принесло. Посоветуйте?


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

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

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


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


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


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

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


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


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


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

>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 фактически сразу, тайм аут не выдерживается. Пробовал также и размер буфера уменьшать - не помогает.


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

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

HTTP/1.1 200 OK
Connection: close


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


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


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


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



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2011.02.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.004 c
3-1252902466
Павел
2009-09-14 08:27
2011.02.13
база данных Access mdb


2-1290590754
Irisss
2010-11-24 12:25
2011.02.13
привести текст к верхнему регистру


15-1289169116
NailMan
2010-11-08 01:31
2011.02.13
Летающие тряпочки


15-1288897823
Новичок
2010-11-04 22:10
2011.02.13
Ищу хорошую книгу по DelphiХ


15-1288621303
crazybobpas
2010-11-01 17:21
2011.02.13
Проблемка: StringGrid + ScroolBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский