Форум: "Начинающим";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];
ВнизЗапись буфера помогите? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.051 c