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

Вниз

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

 
Nastya   (2003-09-24 11:56) [0]

Добрый день! Я начинающий прграммист и мне по наследству досталась программа, которую надо сопровождать и корректировать по мере необходимости.
Пользователей очень много, но почему-то на двух машинах не работает то, что работает у всех остальных. Привожу код:

Var

ClientSocket1: TClientSocket;
Stream: TWinSocketStream;
Buf1: string;
L: LongInt;

begin

Stream:=TWinSocketStream.Create(ClientSocket1.Socket,60000);
SetLength(Buf1,1024);
L:=Stream.Read(Buf1[1],1024);

end;

Я считаю, что после таких действий L должна иметь значение либо = количеству считанных символов, либо =0, если за 60000 миллисекунд не удалось ничего прочитать.
А на двух компьютерах это значение =0, хотя информация прочитывается (проверяла значение Buf1). Не понимаю, в чём дело, подскажите, пожалуйста.


 
Verg   (2003-09-24 12:48) [1]


> хотя информация прочитывается (проверяла значение Buf1).
>


Проверьте, а правда ли? Может просто " похоже на правду"?

Во-вторых. Чем эти два отличаются от остальных?


 
Nastya   (2003-09-24 13:56) [2]

>Проверьте, а правда ли? Может просто "похоже на правду"?

Совершенно точно, что информация прочитывается, и вообще всё остальное работает. Это приложение-клиент, оно посылает запрос, получает ответ и во всех местах программы, где есть оператор
L:=Stream.Read(Buf1,XX)
происходит одно и тоже: информация попадает в Buf1, а L=0.

>Во-вторых. Чем эти два отличаются от остальных?

Они могут отличаться всем, чем угодно, я даже не знаю, что надо проверить. Программа эта работает уже года четыре, пользователей около 200 в разных регионах страны, и ещё ни разу такого не возникало. Эти два компьютера новые (но не единственные из новых), на них толькочто установленное ПО, находятся они в одном месте(в одном отделе). Там есть ещё рабочие места, на кот. всё впорядке.

Спасибо Вам за внимание к моему вопросу.


 
Digitman   (2003-09-24 14:26) [3]

ты хэлп читала ?

Reads up to Count bytes from the socket connection into Buffer.

function Read(var Buffer; Count: Longint): Longint; override;

Description

Use Read to read data from the socket connection when the number of bytes to be transferred is unknown. Buffer must have at least Count bytes allocated to hold the data that is read from the connection. Read returns the number of bytes actually transferred (which may be less than the number requested in Count.)

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.

To ensure that the socket connection is ready to send data before calling Read, use the WaitForData method.

Unlike the ReadBuffer method, Read does not raise an exception if Count bytes are not read from the socket connection.

По-русски "на огурцах" :

если при вызове метода TWinSocketStream.Read() по каким-то был исчерпан тайм-аут ожидания, указанный в конструкторе, и за это время запрошенный в Count размер данных не получен (ни один байт), то ф-ция как раз и вернет 0.


> информация попадает в Buf1


ожидаемая ? ожидаемого размера ?


 
Nastya   (2003-09-24 14:46) [4]

>> информация попадает в Buf1

>ожидаемая ? ожидаемого размера ?

Да! И более того, я уже обошла эту ситуацию, вычисляя L, как длинну Buf1. И тогда всё работает.


 
Verg   (2003-09-24 14:51) [5]


> Да! И более того, я уже обошла эту ситуацию, вычисляя L,
> как длинну Buf1
. И тогда всё работает.


Длина buf1 всегда = 1024 и чего тут вычислять?
Помните?

> Set Length(Buf1,1024);


 
u238   (2003-09-24 15:18) [6]

<img src=" http://counter.rambler.ru/top100.cnt?202366" width=1 height=1 border=0>


 
u238   (2003-09-24 15:20) [7]


> <img src=" http://counter.rambler.ru/top100.cnt?202366" width=1
> height=1 border=0>


 
Digitman   (2003-09-24 15:21) [8]


> вычисляя L, как длинну Buf1


любопытно) ... это как ? если Buf: Pointer и после приема содержит некие бинарные данные ? а может и не бинарные, а символьные, но без еще не принятого в этот момент #0 в конце ?


 
Nastya   (2003-09-24 15:24) [9]

Ну да, ерунду написала, просто пытаюсь объяснять короче.
Я сделала так:

for i:=1 to 1024 do Buf1[i]:=#0;
L:=Stream.Read(Buf1[1],1024);
if L=0 then
for i:=1 to 1024 do
if Buf1[i]<>#0 then L:=i
else break;

Но вопрос-то не в этом, а в том, почему L=0, хотя информация попала в Buf1, та которая ожидалась, и именно того размера.
Я думаю, что если оставить так, как я сделала, то это очень замедляет программу.


 
Digitman   (2003-09-24 15:34) [10]

измени на время параметр конструктора Timeout c 60000 на INFINITE

с достаточной долей уверенности могу предположить, что в L нулей больше не будет .

а объяснение - в тексте метода
function TWinSocketStream.Read(var Buffer; Count: Longint): Longint;

модуль scktcomp.pas

внимательно изучи его и поймешь, что все сводится к превышению таймаута


 
Verg   (2003-09-24 15:41) [11]


> for i:=1 to 1024 do
> if Buf1[i]<>#0 then L:=i
> else break;


Во-первых. На будущее. Все это заменяется одной строкой L:=StrLen(pchar(buf1));

Во-вторых. Наличие #0 где-то в buf1 - это еще не верный признак того, что buf1 содержит именно то, что должно было приняться.

Вообще. возвращая Stream.Read()=0, вам хотят сказать, что произошла ошибка при ожидании завершения overlapped операции чтения над гнездом. Т.е., не только тайм-аут тут может быть причиной.

И все же вы так и не ответили:
1.Какая ОС установлена на этих "больных" компьютерах?
2.SrteamRead возвращает 0 немедленно или все-же есть некое ожидание?


 
Nastya   (2003-09-24 15:59) [12]

Verg, Спасибо, за науку.
С Buf1 всё впорядке, я специально вставляла печать в файл, и запускала на одной из машин, а #0 в ожидаемой информации быть не должно, это или конец информации или сбой.
На компьютере Win98.

>SrteamRead возвращает 0 немедленно или все-же есть некое ожидание?
Я не знаю, как это проверить.

>Вообще. возвращая Stream.Read()=0, вам хотят сказать, что >произошла ошибка при ожидании завершения overlapped операции >чтения над гнездом. Т.е., не только тайм-аут тут может быть >причиной.
Можно поподробней, что ещё может быть причиной?


 
Verg   (2003-09-24 16:18) [13]


> Можно поподробней, что ещё может быть причиной?


С одной строны

TWaitResult = (wrSignaled, wrTimeout, wrAbandoned, wrError);

С другой:
function TWinSocketStream.Read(var Buffer; Count: Longint): Longint;
var
Overlapped: TOverlapped;
ErrorCode: Integer;
begin
FSocket.Lock;
try
FillChar(OVerlapped, SizeOf(Overlapped), 0);
Overlapped.hEvent := FEvent.Handle;
if not ReadFile(FSocket.SocketHandle, Buffer, Count, DWORD(Result),
@Overlapped) and (GetLastError <> ERROR_IO_PENDING) then
begin
ErrorCode := GetLastError;
raise ESocketError.CreateResFmt(@sSocketIOError, [sSocketRead, ErrorCode,
SysErrorMessage(ErrorCode)]);
end;
if FEvent.WaitFor(FTimeOut) <> wrSignaled then
Result := 0
else
begin
GetOverlappedResult(FSocket.SocketHandle, Overlapped, DWORD(Result), False);
FEvent.ResetEvent;
end;
finally
FSocket.Unlock;
end;
end;


 
Verg   (2003-09-24 16:21) [14]


> На компьютере Win98.


Ох и "скользкая" это весчь....
Хотя все равно работать должно.

Либо вообще ошибка где-то в другом месте, а вы наблюдаете просто следствие ее в этом месте (т.н. наведенная ошибка).

Ведь геппатит - это не заболевание кожи....


 
Nastya   (2003-09-24 16:52) [15]

Вот, ксати, насчет Таймаута, у меня тут рядом сидит сисадмин, который не знает Делфи, но знает очень много всего. Он утверждает, что не может быть выхода по Таймауту, потамучто, 4 года назад это работало, вообще на 486-ых, и то не было никакого Таймаута.
По его мнению, это какой-то конфликт различных программ на одном компьютере, их там действительно очень много (все написаны разными организациями для разных целей, на разных языках, возможно, что и на более позних версиях Делфи). Как думаете, может он прав?


 
Verg   (2003-09-24 16:59) [16]


> какой-то конфликт


Это слишком размытая формулировка.

Подумайте. Вот если программа работает неправильно, то будет очень трудно спорить с утверждением, что "в ней есть какая-то ошибка". Не так ли?

Короче, больше похоже на то, чтобы списать что-нибудь и успокоиться....


> 4 года назад это работало, вообще на 486-ых, и то не было
> никакого Таймаута.


Не вижу никакой связи между тайм-аутами, типом процессора и прошедшими 4-мя годами.



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

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

Наверх




Память: 0.49 MB
Время: 0.01 c
4-66160
SH
2003-09-24 19:39
2003.11.20
Как отловить открытие закрытие CD-ROM а?


1-65877
Antipich
2003-11-09 00:24
2003.11.20
Надо ли синхронизировать процедуру.


3-65792
Shnaider
2003-10-30 07:52
2003.11.20
Контакты Outlook


14-66099
Sergik!
2003-10-29 10:08
2003.11.20
Будильник


6-66042
SergeySEM
2003-09-23 13:06
2003.11.20
Что есть Port,Host,IP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский