![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись буфера помогите?
r.o.o.t © (2007-07-29 12:39:00)Как записать мне то что хранится в buf в переменную Reply:WideString?
LengthA:=Socket.ReceiveLength;
GetMem(Buf,LengthA);
Socket.ReceiveBuf(Buf^,LengthA);
write(Reply,buf^);Тут надо записать как?
FreeMem(buf);
Сергей М. (2007-07-30 16:04:00) [41]
> Evgeny V © (30.07.07 16:01) [19]
> Ты придуриваешься или просто так
Да, я "придуриваюсь", не закрывая глаза на то, что какой-то придурок ничтоже сумняшеся приводит код, игнорирующий результат вызова функциональногометода, в то время как речь идет именно о необходимости анализа результатов вызовов таких методов, особенно в условиях глоб.сети !
Evgeny V (2007-07-30 16:04:00) [42]
> Сергей М. © (30.07.07 15:48) [18]
> Прекращай засранство
За своими словами последи, так пройдись по постам попорядку и посмотри где начались наезды и кто начал кидать термины
Evgeny V (2007-07-30 16:01:00) [43]
> Сергей М. © (30.07.07 15:44) [17]
> SendBuf - функциональный метод !!!!!!!!!!!!!!!
Ты придуриваешься или просто так. Да знаю я что функциональный, тебе просто пример дали, что бы ты в отладчике прошагал.
ты это читал
> Это написано только для показа, что принимает ReceiveBuf
> не больше, чем я ему указал. Меньше может вернуть, больше
> нет.
Я это специально написал, что бы указать, что нет у меня времени писать тебе программу, я дал тестовый код в котором вполне нормально видно, что приехало столько-то байт, а принято столько или меньше чем я указал. Если тебе охото проверить сколько услал клиент -сделай это в своем тесте. А вопрос в том, что ReceiveBuf вернет столько, сколько в очереди, верно лишь в том случае, если в очереди меньше или равно, чем я указал для приема, если в очереди больше, то ReceiveBuf вернет столько, сколько указано в параметре - РАЗМЕР БУФЕРА, если конечно не было ошибок. Я думал по твоим ответам на форуме, что ты знаешь, а пока сейчас вижу только желание повставлять цитаты и показать свое знание. Ну прошагай отладчиком, напиши цифирки, которые я указал... Спорим на пустом месте. Что принять можем или запросили или меньше, если в очереди меньше, чем запросили Но не больше чем мы запросили (указали размер буфера)! Это мое мнение, твое - что столько сколько в очереди, и если в очереди больше, чем мы просим, то мы примем больше???
Сергей М. © (30.07.07 14:06) [8] Сколько queued, столько и вернет
И в конце ты все таки уже даешь
> Сергей М. © (30.07.07 14:44) [14]
> Min("запрошено", "физически доступно в очереди чтения")
А вот это верно. Изменил мнение или поправился? Так за что наезды, если я сказал сразу то же самое?
Или у тебя еще какие-то сомнения в
> Evgeny V © (30.07.07 14:03) [7]
Так возьми отладчик - 10 минут в дельфи сделать, то что я тебе написал и вперед- поделись результатами....
Сергей М. (2007-07-30 15:48:00) [44]
> тольковый вы наш
Прекращай засранство и тестируй свой код в условиях глобальной сети - убедись что он НЕ работоспособен.
Сергей М. (2007-07-30 15:44:00) [45]
> Evgeny V © (30.07.07 15:38) [16]
> for i:=0 to 100 do
> b[i]:=byte(i);
> CS1.Socket. SendBuf(b,100);
SendBuf - функциональный метод !!!!!!!!!!!!!!!
Это что, не очевидно ?
Ну нельзя же быть таким тупым, когда намекают на функциональнуюдекларацию неких методов некоего объекта)
Evgeny V (2007-07-30 15:38:00) [46]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp;
type
TForm1 = class(TForm)
CS1: TClientSocket;
SS1: TServerSocket;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure CS1Connect(Sender: TObject; Socket: TCustomWinSocket);
procedure SS1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
b:array [0..100] of byte;
i:integer;
begin
for i:=0 to 100 do
b[i]:=byte(i);
CS1.Socket.SendBuf(b,100);
Sleep(1000);// жду когда приедет побольше
end;
procedure TForm1.CS1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
ShowMessage('Connect');
end;
procedure TForm1.SS1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
b:array [0..100] of byte;
k,i:integer;
begin
k:=Socket.ReceiveLength;
> i:=Socket.ReceiveBuf(b,5);
end;
end.
дельфи 6 TclientSocket (CS11) и TServerSocket (SS1), для упрощения в дизайне обоим поставил Active:=true использовал адрес 127,0,0,1 порты подберите сами, оптимизация выключена. Поставте тольковый вы наш точку останова на
i:=Socket.ReceiveBuf(b,5); и посмотрите чему равно k и i (у меня к:=100,i:=5)
Это написано только для показа, что принимает ReceiveBuf не больше, чем я ему указал. Меньше может вернуть, больше нет.
Сергей М. (2007-07-30 14:50:00) [47]Для особо бестолковых иллюстрирую сказанное в коде:
BytesExpected := Socket.ReceiveLength;
GetMem(Buf, BytesExpected);
try
BytesReceived := Socket.ReceiveBuf(Buf^, BytesExpected);
if BytesReceived > 0 then
SomeStream.WriteBuffer(buf^, BytesReceived);
finally
FreeMem(Buf);
end;
Сергей М. (2007-07-30 14:44:00) [48]
> > Сколько queued, столько и вернет.
> не верно.
>
Вернет он ЭТО:
Min("запрошено", "физически доступно в очереди чтения")
Сергей М. (2007-07-30 14:42:00) [49]
> гарантированно лежит в буфере
Да щщщас !
Что такое "queued" понимаешь ? Или для тебя это пустое слово ?
> вижу цитирование хелпа, причем не совсем подходящего к конкретному
> случаю
Подходит. Причем стопроцентно.
Более того - вызов ReceiveLength нафих не нужен, если в соотвесьтствии с ПИО на данном шаге ожидается к приему не более N байт.
Вот сколько receive-метод вернул из этих запрошенных тобой к приему N байт - стольким и довольствуйся - более во вх.буфере на этот момент нет физически, хоть даже и показал тебе ReceiveLength в десять раз больше)
Evgeny V (2007-07-30 14:42:00) [50]
> Evgeny V © (30.07.07 14:25) [11]
> Если бы он просто запросил какое-то число на чтение, не
> проверив сколько доступно для чтения, то вы были бы правы.
>
Причем отчасти правы, больше чем указан размер буфера все равно не вернет, ваше
> Сколько queued, столько и вернет.
не верно.
Evgeny V (2007-07-30 14:25:00) [51]
> Сергей М. © (30.07.07 14:06) [8]
Не понял где врать?
Если не будет ошибки ( -1 в этом случае), то ReceiveBuf вернет, столько, сколько он запросил, а запросил он то, что уже гарантированно лежит в буфере. Потому как он это число получил заранее. Меньше уже не вернет(опять таки если не будет ошибки, о чем писал). Больше тоже, хотя на момент чтения в буфере уже может быть больше, чем когда он получил LengthA. Если вы думаетет по другому - обоснуйте, а так я пока вижу цитирование хелпа, причем не совсем подходящего к конкретному случаю. Если бы он просто запросил какое-то число на чтение, не проверив сколько доступно для чтения, то вы были бы правы.
Сергей М. (2007-07-30 14:21:00) [52]Кто о че м, а лысый все о расческе)
R.O.O.T (2007-07-30 14:18:00) [53]LengthA:=Socket.ReceiveLength;
GetMem(bufA,LengthA);
Socket.ReceiveBuf(bufA, LengthA);
src := TFileStream.Create('C:\myfile.tmp',fmCreate);
src.Seek(0,soFromEnd);
src.WriteBuffer(bufA,LengthA);
src.Free;
FreeMem(bufA);
почему FreeMem(bufA) происходит с ошибкой в библиотеке oleout32.dll?
Сергей М. (2007-07-30 14:06:00) [54]
> Evgeny V © (30.07.07 14:03) [7]
Не надо врать самому себе.
Бо нечтение (или нежелание чтения) док-ции откровенным дилетантством отдает.
Сколько queued, столько и вернет.
Evgeny V (2007-07-30 14:03:00) [55]
> SlymRO © (30.07.07 10:02) [4]
Да вы правы,
> будет равно LengthA
, если по какой-либо причине например не возникнет ошибка. Проверить бы не мешало, не трудно ведь:-))
Сергей М. (2007-07-30 10:17:00) [56]Цитата из Winsock API Reference (ioctlsocket):
If s is stream oriented (for example, type SOCK_STREAM), FIONREAD returns an amount of data which can be read in a single recv; this may or may not be the same as the total amount of data queued on the socket
Сергей М. (2007-07-30 10:11:00) [57]
> SlymRO © (30.07.07 10:02) [4]
Note: ReceiveLength is not guaranteed to be accurate for streaming socket connections
SlymRO (2007-07-30 10:02:00) [58]Сергей М. © (30.07.07 9:16) [3]
В данном случае будет равно LengthA, т.к. ReceiveLength ворачивает доступное к чтению без блокировки
Сергей М. (2007-07-30 09:16:00) [59]
> r.o.o.t © (29.07.07 12:39)
Сначала с чтением разберись.
ReceiveBuf - функциональныйметод. Значение, возвращаемое им, не обязано быть равным LengthA.
SlymRO (2007-07-30 04:30:00) [60]а если нечетное колво байт? Wide это 2байта на символ :)