![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с Socket.ReceiveBuf
Gektor © (2005-09-01 11:31:00)В событии OnRead пишу:
var i : Integer;
Len : Integer;
pbuf : PMyArray;
begin
{Принимаем данные и ложим сразу в конец IncomingBuff}
while (Socket.ReceiveLength > 0) do
begin
Len := Socket.ReceiveLength;
i := 0;
try
pbuf := Pointer(fIncomingBuf^[fIncomingBufLen]);
i := Socket.ReceiveBuf(pbuf,Len);
except
AddToDebugLog('Error with receiving Some Data');
end;
и тд...
в Отладчике в первый же раз, при выполнении строки i := Socket.ReceiveBuf(pbuf,Len); выдает окошко CPU и вылетает с ошибками.
Буферы точно созданны.
fIncomingBufLen = 0.
В Len не нулевое значение.
PMyArray Указатель на array[0 .. 7999]
В чем можеть быть проблема?
Digitman (2005-09-01 14:37:00) [1]
> ALI_YES (01.09.05 14:30) [8]
я считаю, что прежде чем давать советы в [3] нужно внимательно изучить сабж.
сабж же говорит об выборе (осознанном или неосознанном - неважно) автором режима ctNonBlocking, для которого TWinSocketStream неприменим в принципе.
> более удобен?
причем здесь "удобство" ?
ALI_YES (2005-09-01 14:30:00) [2]
> Digitman © (01.09.05 13:25) [7]
Хорошо, пусть он выбрал.
Но, ты считаешь, что
> асинхронный неблокирующий режим.
более удобен?
Digitman (2005-09-01 13:25:00) [3]
> ALI_YES (01.09.05 12:52) [6]
судя по OnRead ни о каких TWinSocketStream не может идти и речи.
автор выбрал асинхронный неблокирующий режим.
ALI_YES (2005-09-01 12:52:00) [4]
> Digitman © (01.09.05 12:47) [5]
Я знаю, просто кому-нибудь это показалось бы удобней
Digitman (2005-09-01 12:47:00) [5]
> ALI_YES (01.09.05 12:23) [3]
> если .. надо передавать большие объемы данных, то ..
> лучше испльзовать класс TWinSocketStream.
глупости.
возможность и/или необходимость использования класса TWinSocketStream никак не зависит от объемов транспортируемых данных
возможность зависит от Client/ServerType
необходимость зависит от реально имеющейся возможности + фантазии
Digitman (2005-09-01 12:44:00) [6]
> сразу отрабатывает OnError
это уже из другой оперы.
к тому же никаких "сразу" быть не может.
ReceiveBuf - синхронный блокирующий метод, он либо отрабатывает успешно (т.е. после выполнения возвращает управление на следующий за вызовом ReceiveBuf оператор ) либо возбуждает исключение.
Учимся пользоваться встроенным в Делфи-среду отладчиком !
ALI_YES (2005-09-01 12:23:00) [7]Действительно Паскаль надо знать.
Но если тебе надо передавать большие объемы данных, то тебе лучше испльзовать класс TWinSocketStream.
Gektor (2005-09-01 12:13:00) [8]
> Digitman ©
i := Socket.ReceiveBuf(pbuf^,Len); и сразу отрабатывает OnError
Digitman (2005-09-01 11:53:00) [9]Паскаль нужно знать как "Отче наш" !
i := Socket.ReceiveBuf(pbuf ^,Len);
к тому же еще и логика неверна ..
зачем тут цикл понадобился, спрашивается ?