Форум: "Сети";
Текущий архив: 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