Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.26;
Скачать: CL | DM;

Вниз

Запись буфера помогите?   Найти похожие ветки 

 
r.o.o.t ©   (2007-07-29 12:39) [0]

Как записать мне то что хранится в buf в переменную Reply:WideString?

LengthA:=Socket.ReceiveLength;
   GetMem(Buf,LengthA);
   Socket.ReceiveBuf(Buf^,LengthA);
    write(Reply,buf^);Тут надо записать как?
   FreeMem(buf);


 
Юрий Зотов ©   (2007-07-29 13:34) [1]

Move


 
SlymRO ©   (2007-07-30 04:30) [2]

а если нечетное колво байт? Wide это 2байта на символ :)


 
Сергей М. ©   (2007-07-30 09:16) [3]


> r.o.o.t ©   (29.07.07 12:39)


Сначала с чтением разберись.

ReceiveBuf - функциональный метод. Значение, возвращаемое им, не обязано быть равным LengthA.


 
SlymRO ©   (2007-07-30 10:02) [4]

Сергей М. ©   (30.07.07 9:16) [3]
В данном случае будет равно LengthA, т.к. ReceiveLength ворачивает доступное к чтению без блокировки


 
Сергей М. ©   (2007-07-30 10:11) [5]


> SlymRO ©   (30.07.07 10:02) [4]


Note: ReceiveLength is not guaranteed to be accurate for streaming socket connections


 
Сергей М. ©   (2007-07-30 10:17) [6]

Цитата из 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


 
Evgeny V ©   (2007-07-30 14:03) [7]


> SlymRO ©   (30.07.07 10:02) [4]

Да вы правы,
> будет равно LengthA

, если по какой-либо причине например не возникнет ошибка. Проверить бы не мешало, не трудно ведь:-))


 
Сергей М. ©   (2007-07-30 14:06) [8]


> Evgeny V ©   (30.07.07 14:03) [7]


Не надо врать самому себе.
Бо нечтение (или нежелание чтения) док-ции откровенным дилетантством отдает.

Сколько queued, столько и вернет.


 
R.O.O.T ©   (2007-07-30 14:18) [9]

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:21) [10]

Кто о че м, а лысый все о расческе)


 
Evgeny V ©   (2007-07-30 14:25) [11]


> Сергей М. ©   (30.07.07 14:06) [8]


Не понял где врать?
Если не будет ошибки ( -1 в этом случае), то ReceiveBuf  вернет, столько, сколько он запросил, а запросил он то, что уже гарантированно лежит в буфере. Потому как он это число получил заранее. Меньше уже не вернет(опять таки если не будет ошибки, о чем писал). Больше тоже, хотя на момент чтения в буфере уже может быть больше, чем когда он получил LengthA.  Если вы думаетет по другому - обоснуйте, а так я пока вижу цитирование хелпа, причем не совсем подходящего к конкретному случаю. Если бы он просто запросил какое-то число на чтение, не проверив сколько доступно для чтения, то вы были бы правы.


 
Evgeny V ©   (2007-07-30 14:42) [12]


> Evgeny V ©   (30.07.07 14:25) [11]
> Если бы он просто запросил какое-то число на чтение, не
> проверив сколько доступно для чтения, то вы были бы правы.
>

Причем отчасти правы, больше чем указан размер буфера все равно не вернет, ваше  
> Сколько queued, столько и вернет.
не верно.


 
Сергей М. ©   (2007-07-30 14:42) [13]


> гарантированно лежит в буфере


Да щщщас !

Что такое "queued" понимаешь ? Или для тебя это пустое слово ?


> вижу цитирование хелпа, причем не совсем подходящего к конкретному
> случаю


Подходит. Причем стопроцентно.

Более того - вызов ReceiveLength нафих не нужен, если в соотвесьтствии с ПИО на данном шаге ожидается к приему не более N байт.

Вот сколько receive-метод вернул из этих запрошенных тобой к приему N байт - стольким и довольствуйся - более во вх.буфере на этот момент нет физически, хоть даже и показал тебе ReceiveLength в десять раз больше)


 
Сергей М. ©   (2007-07-30 14:44) [14]


> > Сколько queued, столько и вернет.
> не верно.
>


Вернет он ЭТО:

Min("запрошено", "физически доступно в очереди чтения")


 
Сергей М. ©   (2007-07-30 14:50) [15]

Для особо бестолковых иллюстрирую сказанное в коде:

  BytesExpected := Socket.ReceiveLength;
  GetMem(Buf, BytesExpected);
  try
    BytesReceived := Socket.ReceiveBuf(Buf^, BytesExpected);
    if BytesReceived > 0 then
      SomeStream.WriteBuffer(buf^, BytesReceived);
  finally
    FreeMem(Buf);
  end;


 
Evgeny V ©   (2007-07-30 15:38) [16]

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 15:44) [17]


> Evgeny V ©   (30.07.07 15:38) [16]



>  for i:=0 to 100 do
>   b[i]:=byte(i);
>  CS1.Socket.SendBuf(b,100);


SendBuf - функциональный  метод !!!!!!!!!!!!!!!

Это что, не очевидно ?

Ну нельзя же быть таким тупым, когда намекают на функциональную декларацию неких методов некоего объекта)


 
Сергей М. ©   (2007-07-30 15:48) [18]


> тольковый вы наш


Прекращай засранство и тестируй свой код в условиях глобальной сети - убедись что он НЕ работоспособен.


 
Evgeny V ©   (2007-07-30 16:01) [19]


> Сергей М. ©   (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 минут в дельфи сделать, то что я тебе написал и вперед- поделись результатами....


 
Evgeny V ©   (2007-07-30 16:04) [20]


> Сергей М. ©   (30.07.07 15:48) [18]
> Прекращай засранство

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


 
Сергей М. ©   (2007-07-30 16:04) [21]


> Evgeny V ©   (30.07.07 16:01) [19]
> Ты придуриваешься или просто так


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


 
Сергей М. ©   (2007-07-30 16:07) [22]


> Evgeny V ©   (30.07.07 16:04) [20]
>
>


Ты в этой ветке вообще что хотел сказать ?

ЕЩЕ раз повторяю, для ОСОБО бестолковых  - функция возвращает результат не для Пушкина, а для тебя !


 
Сергей М. ©   (2007-07-30 16:09) [23]


> Evgeny V


Коду, не анализирующему рез-ты send/recv-вызовов - место в мусорном ведре.
Рано или поздно он даст сбой.


 
Evgeny V ©   (2007-07-30 16:12) [24]


> Сергей М. ©   (30.07.07 16:04) [21]

Все понял.... А результаты теста у себя значит не привел? Или слабо было сделать свой такой же в локальной сети с компа на комп. Я бы сделал, но тебе доказывать наверное бесполезно, потому, что пока аргументов с твоей стороны, кроме как "сам дурак не увидел". Никого кода не увидел в качестве аргумента. Как сделаешь, приведи пожалуйста код, где
i:=Socket.ReceiveBuf(b,j);

и I при этом будет больше J, это же ты хотел сказать в
> Сергей М. ©   (30.07.07 14:06) [8]  Сколько queued, столько
> и вернет
.  Правда потом съехал на правильный ответ, ну так сразу надо писать правильно и понятно. Или признавать ошибки.
Все конец рабочего дня, иду домой. Будет код с  I > J, поговорим. А так это глухой телефон.


 
Сергей М. ©   (2007-07-30 16:13) [25]


> пройдись по постам


Ну прошелся.

И по какому же поводу в [16] ты вперся в тему с кодом, не имеющим отношения к сабжу, но содержащим другие серьезные ошибки в очевидно логике ?


 
Сергей М. ©   (2007-07-30 16:15) [26]

Да, I никогда не будет больше J.

Но ведь Автор пытается писать эти J байт в файл, в то время как в буфере B актуальны всего лишь первые I байт !


 
Evgeny V ©   (2007-07-30 16:17) [27]


> Сергей М. ©   (30.07.07 16:09) [23]

А вот про анализ - возврата функций -согласен, ну так надо различать, то что тебе написали за 2 минуты для проверки утверждения тут же не отходя от кассы(о чем я и написал, когда выложил код) и рабочий проект. Скажи просто нашел к чему прицепиться. Если я тебе в тесте написал бы
I:= CS1.Socket.SendBuf(b,100) ты бы сразу сказал, ой да, больше принять мы не можем, чем заказали. Да неважно мне сколько он отправил в данном случае. Важно сколько принял... Так что давай  свой правильный код с I > тогда посмотрим.


 
Сергей М. ©   (2007-07-30 16:18) [28]


> про анализ - возврата функций -согласен


КАКОГО же хрена его нет в твоем коде ?)


 
Сергей М. ©   (2007-07-30 16:22) [29]


> Evgeny V ©   (30.07.07 16:17) [27]


И КАКОГО хрена ты не приводишь состояние св-ва, готносящегося к блокировке , коль ты так уверен ?)


 
Сергей М. ©   (2007-07-30 16:23) [30]


> Evgeny V


Или ты не понимаешь, что методы приема/передачи этого гобъекта ведут себя по-разному в зависимости от состояния этого св-ва ?)


 
Evgeny V ©   (2007-07-30 16:25) [31]


> Сергей М. ©   (30.07.07 16:15) [26]
> Да, I никогда не будет больше J.


И чего ты тогда споришь?
> в то время как в буфере B актуальны всего лишь первые I
> байт !


Да верно, и в его случае правда, что  I=J, так как байты уже в очереди или второй вариант - будет ошибка -1

> Evgeny V ©   (30.07.07 14:03) [7]
> , если по какой-либо причине например не возникнет ошибка.
>  Проверить бы не мешало, не трудно ведь:-))

Приведи код, где с указанным (проверь возврат функции) где это будет не так

1 Получем ReceiveLength
2 Читаем  ReceiveLength байт и получаем меньше на возврате (но не ошибку    -1)


 
umbra ©   (2007-07-30 16:28) [32]

во люди дают, говорят одно и тоже, и при этом ругаются!


 
Evgeny V ©   (2007-07-30 16:28) [33]


> Сергей М. ©   (30.07.07 16:23) [30]


> Сергей М. ©   (30.07.07 16:22) [29]

Блокировку поставь как тебе надо. Без разницы, у меня был неблокирующий. ReceiveLenghth получен до вызова приема в переменную и функция приема считает столько сколько попросил. Ладно все домой, вежливый вы наш. Завтра посмотрю, если у тебя будет код :-))


 
Сергей М. ©   (2007-07-30 16:30) [34]


> Evgeny V ©   (30.07.07 16:25) [31]



> Приведи код, где с указанным (проверь возврат функции) где
> это будет не так
>
> 1 Получем ReceiveLength
> 2 Читаем  ReceiveLength байт и получаем меньше на возврате
> (но не ошибку    -1)


Тебе в код Борланда носом тыкать надо, да ?

Изволь:

function TCustomWinSocket.ReceiveText: string;
begin
 SetLength(Result, ReceiveBuf(Pointer(nil)^, -1));
 SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)));
end;


Мне оправдать действия Борланда или сам дотумкаешь ?)


 
Сергей М. ©   (2007-07-30 16:34) [35]


> Evgeny V ©   (30.07.07 16:28) [33]


> Без разницы, у меня был неблокирующий


Да похрену какой он у тебя был, если твой код не работал в глоб.сети, когда твой сервер и/тлт твой клиент разнесены в разные (непредсказуемые) "углы" Тырнета.


 
DVM ©   (2007-07-30 16:38) [36]

Горячие финские парни!

Евгений вы же уже домой шли :)


 
Сергей М. ©   (2007-07-30 16:48) [37]


> DVM ©   (30.07.07 16:38) [36]


А вот и не подеремся)


 
Сергей М. ©   (2007-07-30 16:54) [38]


> Sleep(1000);// жду когда приедет побольше


Галиматья несусветная.


 
r.o.o.t ©   (2007-07-30 17:25) [39]

Lock;
 try
   Result := 0;
   if (Count = -1) and FConnected then
     ioctlsocket(FSocket, FIONREAD, Longint(Result))
   else begin
     if not FConnected then Exit;
     if ioctlsocket(FSocket, FIONREAD, iCount) = 0 then
     begin
       if (iCount > 0) and (iCount < Count) then
         Count := iCount;
     end;

     Result := recv(FSocket, Buf, Count, 0);
/...............................................................................

я думаю всегда будет i=j

при ReceiveText невсегда реч шла о методе Send/Receivebuf


 
r.o.o.t ©   (2007-07-30 17:30) [40]

лан все фигня вот следующий вопрос

GetMem(bufA,LengthA);
   Socket.ReceiveBuf(bufA^, LengthA);
   Reply:=StrPas(bufA)
SockHWND:= StrToInt(ClientID.Strings[i]);
          for j := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
           if ServerSocket1.Socket.Connections[j].SocketHandle=SockHWND then
           begin
              ServerSocket1.Socket.Connections[j].SendBuf(bufA^,Length(bufa));
           end;

FreeMem(BufA);

Почему происходит утечка памяти???
т.е. размер приложения в памяти растет на велечину LengthA+30  
как это возможно ? неправельно освобождается bufA??



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

Текущий архив: 2007.08.26;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.024 c
15-1185277953
Труп Васи Доброго
2007-07-24 15:52
2007.08.26
Кто из вас летчик? (тест)


15-1185716945
ArtemESC
2007-07-29 17:49
2007.08.26
Не подскажите название песни?


8-1163506896
megasecure
2006-11-14 15:21
2007.08.26
Рисование с пом. Polyline


15-1185527097
TruePunk
2007-07-27 13:04
2007.08.26
крестики


15-1185875868
Igorek
2007-07-31 13:57
2007.08.26
Чем чревато?