Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запись буфера помогите?


Страницы:   1 2 3 4

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байта на символ :)


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо