Форум: "Потрепаться";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
ВнизКто найдет ошибку? Найти похожие ветки
← →
Программер_ (2004-09-16 17:17) [0]
unit LongDataTransfer;
interface
uses ScktComp;
Type TMySProc = procedure(const S:AnsiString);
function SendLongText(Socket:TCustomWinSocket; S:String):boolean;
function ReceiveLongText(Socket:TCustomWinSocket;MySProc:TMySProc;SafeCalledStr :string = ""):boolean;
procedure FlushBuffers;
var
InputBuf : String;
InputDataSize : LongWord;
InputReceivedSize : LongWord;
implementation
function SendLongText(Socket:TCustomWinSocket; S:String):boolean;
Var TextSize:integer;
TSSig : string[4];
begin
Result:=True;
Try
If not Socket.Connected then Exit;
TextSize:=Length(S);
asm
mov EAX,TextSize;
mov dword ptr TSSig[1],EAX;
mov byte ptr TSSig[0],4;
end;
S:=String(TSSig+S);
Socket.SendBuf(Pointer(S)^,Length(S));
except Result:=False;
end;
end;
procedure FlushBuffers;
begin
InputBuf:="";
InputDataSize:=0;
InputReceivedSize:=0;
end;
function ReceiveLongText(Socket:TCustomWinSocket;MySProc:TMySProc;SafeCalledStr :string = ""):boolean;
var
S:String;
RDSize:LongWord;
F:String[4];
begin
Result:=True;
try
If SafeCalledStr="" then begin
RDSize:=Socket.ReceiveLength;
S:=Socket.ReceiveText;
end
else begin
S:=SafeCalledStr;
RDSize:=length(S);
end;
If (Length(InputBuf)<4) and (Length(InputBuf)>0) then begin //Êîððåêòèðîâêà, â òîì ñëó÷àå
S:=InputBuf+S; //åñëè ôðàãìåíòèðîâàí ñàì çàãîëîâîê
FlushBuffers; //áëîêà äàííûõ
end;
If InputBuf="" then
begin //Ñàìûé ïåðâûé ïàêåò;
F:=Copy(S,0,4);
asm
mov EAX,dword ptr F[1];
mov InputDataSize,EAX;
end;
if InputDataSize=RDSize-4 then begin //Îäèí áëîê â ïàêåòå
InputBuf:=Copy(S,5,RDSize-4); //íè ñëåïêè, íè ôðàãìåíòàöèè íåò.
MySProc(InputBuf);
FlushBuffers;
Exit;
end;
if InputDataSize<RDSize-4 then begin //Ïàêåò ñëåïëåí.
InputBuf:=Copy(S,5,InputDataSize);
MySProc(InputBuf);
Delete(S,1,InputDataSize+4);
FlushBuffers;
ReceiveLongText(Socket,MySProc,S);
Exit;
end;
if InputDataSize>RDSize-4 then begin //ýòî ÏÅÐÂÛÉ ôðàãìåíò
InputBuf:=Copy(S,5,RDSize-4); //áîëüøîãî ïàêåòà
InputReceivedSize:=RDSize-4;
end;
end
else begin //Áóôåð ïðèåìà íå ïóñò
//InputBuf:=
If RDSize+InputReceivedSize=InputDataSize then
begin //Ïîëó÷èëè ïîñëåäíèé
InputBuf:=InputBuf+Copy(S,0,RDSize); //ôðàãìåíò öåëèêîì
MySProc(InputBuf); //â ïàêåòå, äàííûõ
FlushBuffers; // â ïàêåòå áîëüøå íåò
Exit;
end;
If RDSize+InputReceivedSize<InputDataSize then // Ïîëó÷èëè
begin //î÷åðåäíîé
InputBuf:=InputBuf+Copy(S,0,RDSize); //ôðàãìåíò
InputReceivedSize:=InputReceivedSize+RDSize;
Exit;
end;
If RDSize+InputReceivedSize>InputDataSize then //Ïîëåäíèé ôðàãìåíò
begin // íî â ïàêåòå åñòü åùå äàííûå - ñëåïëåí.
InputBuf:=InputBuf+Copy(S,0,InputDataSize-InputReceivedSize);
MySProc(InputBuf);
Delete(S,1,InputDataSize-InputReceivedSize);
FlushBuffers;
ReceiveLongText(Socket,MySProc,S);
end;
end;
except Result:=False;
end;
end;
end.
← →
Ega23 © (2004-09-16 17:19) [1]Что будет Тому, Кто Найдёт Ошибку за то, что он найдёт ошибку?
← →
Суслик © (2004-09-16 17:22) [2]Прямо как на передаче "Своя игра".
-Борис, выбирайте
-Кривые руки 600
-Он способен довести до сумасшествия лбого начинающего программера
БИП
-Компьютер!
-Побойтесь бога, при чем здесь это. Нет!
БИП
-Access violation!
-Браво! Выбирайте.
-Кривые руки 1000.
...
← →
VMcL © (2004-09-16 17:24) [3]>>Программер_ (16.09.04 17:17)
>Кто найдет ошибку?
Ты.
← →
-SeM- (2004-09-16 17:29) [4]Ты хоть бы указал в какой строке искать
← →
-SeM- (2004-09-16 17:33) [5]А вообще тебе какую надо?
← →
Romkin © (2004-09-16 17:33) [6]:)))
Млин, ухохочешься...
-SeM- (16.09.04 17:29) [4] Для начала надо бы структурировать код научиться. Структурируешь - глядь, а ошибка сама и нашлась :))
А то за такой код я обычно канделябром бью...
← →
Fredericco © (2004-09-16 17:42) [7]Как вариант:
необоснованное использование асма.
← →
DiamondShark © (2004-09-16 17:46) [8]УжасТЬ.
Ну... для начала
function SendLongText(Socket:TCustomWinSocket; S:String):boolean;
Var
TextSize:integer;
begin
Result:=True;
Try
If not Socket.Connected then Exit;
TextSize:=Length(S);
Socket.SendBuf(TextSize, 4);
if TextSize > 0 thne Socket.SendBuf(Pointer(S)^,Length(S));
except Result:=False;
end;
end;
Проще надо быть...
А дальше -- за деньги.
← →
Программер_ (2004-09-16 17:49) [9]народ ну хватит ржать помогите лучше найти и исправить , ато у меня целый проект сорвался из-за того что данный код не всегда верно передает большой объм текста
← →
Игорь Шевченко © (2004-09-16 17:55) [10]
> помогите лучше найти и исправить
Суммы не видно
← →
Fredericco © (2004-09-16 17:56) [11]<offtop>
Интересно, когда, наконец, народ поймет, что Project1 это не совсем тот проект, что понимается в IT индустрии...
</offtop>
← →
DiamondShark © (2004-09-16 18:04) [12]
> Программер_ (16.09.04 17:49) [9]
Так ты бы так и говорил: народ, напишите мне функции передачи большого объёма текста.
Вот видишь, как замечательно получается: ТЗ уже есть, осталось огласить сумму.
← →
Vovchik_A © (2004-09-16 18:09) [13]2Программер_ (16.09.04 17:17)
Среди нас телепатов мало. А разбирать чужой код - уж лучше свой написать, имхо. А про ошибку скажут - в ДНК, опять имхо.
P.S.
Извини за стеб, ничего личного.
← →
Программер_ (2004-09-16 18:20) [14]Vovchik_A © (16.09.04 18:09) [13]
ну помогли бы написать
← →
SPeller © (2004-09-16 18:23) [15]Ради приличая хоть бы форматировщик текста натравил на этот безобразнейший код.
← →
Программер_ (2004-09-16 18:37) [16]Народ ну хоть кто-нить отзовитесь , как сделать что-бы работало нормально?
← →
Romkin © (2004-09-16 18:43) [17]Программер_ (16.09.04 18:37) [16] Прокладку поменять!!!
← →
Verg © (2004-09-16 18:45) [18]Да никак
FlushBuffers - это хто?
InputBuf - это откуда он свои значения принимат?
ReceiveLongText(Socket,MySProc,S); - это хренова рекурсия?
RDSize:=Socket.ReceiveLength; - это ты о чем подумал? Ты справку по этой функцайке зырил (до конца, до note)?
И т.д. и т.п.....
Надо чаще "Сети" читать, а не потрепе ошиваться.
Ну, а дисциплина кода, как тут уже все отметили, просто убивает!
← →
Программер_ (2004-09-17 08:47) [19]Уменя сегодня еще + два вопроса
1. может ли этот код использоватся для сервер сокета если клиентов штук 10 , ведь InputBuf всего один?
2.Где взять форматировщик кода?
3. Заранее всем благодарен.
P.S
Может все-таки поможете этот код довести до ума?
← →
Cobalt © (2004-09-18 09:32) [20]2 Программер_ (17.09.04 08:47) [19]
Оглашаешь сумму (можно, думаю, и пивом) - и дело сдвинется с мёртвой точки.
Потому как просто заинтересовать ты не сумел :(
P.S. Кстати, научись перед копированием текста переключаться на русский язык - а то на тебя вообще болт положут - комментарии не видны
← →
SPeller © (2004-09-18 09:34) [21]
> Где взять форматировщик кода?
В поисковике набери DelForEx
← →
Программер_ (2004-09-18 12:42) [22]Мастера ну хватить насмехаться , и вы наверно тоже не все сразу узнали ,
я очень хочу сам понять что к чему ну что поделаешь знаний еще не хватает поэтому я обратился за помощью на этот форум в надежде что мне помогут , а вместо этого насмешки , поймите я начинающий и денег у меня нету может если бы вы были рядом я бы поставил пиво , а так...
мне за этот алгоритм тоже никто не заплатит
С Уважением Денис .
← →
cyborg © (2004-09-18 12:54) [23]
> [22] Программер_ (18.09.04 12:42)
По началу структуру кода нормальную сделай, и по русски напиши комментарии, и впредь смотри чего ты копипастишь, а потом проси найти ошибки. Никому не охото рассматривать ту свалку.
← →
Программер_ (2004-09-18 13:32) [24]Вот Отформатировал код:
unit LongDataTransfer;
interface
uses ScktComp;
TYPE TMySProc =
PROCEDURE (CONST S:AnsiString);
FUNCTION SendLongText(Socket:TCustomWinSocket; S:STRING): boolean;
FUNCTION ReceiveLongText(Socket:TCustomWinSocket;MySProc:TMySProc;SafeCalledStr :STRING =
""): boolean;
PROCEDURE FlushBuffers;
VAR
InputBuf : STRING;
InputDataSize : LongWord;
InputReceivedSize : LongWord;
implementation
FUNCTION SendLongText(Socket:TCustomWinSocket; S:STRING): boolean;
VAR TextSize: integer;
TSSig : STRING[4];
BEGIN
Result := True;
Try
IF NOT Socket.Connected
THEN Exit;
TextSize := Length(S);
asm
mov EAX,TextSize;
mov dword ptr TSSig[1],EAX;
mov byte ptr TSSig[0],4;
END;
S := STRING(TSSig+S);
Socket.SendBuf(Pointer(S)^,Length(S));
except Result := False;
END;
END;
PROCEDURE FlushBuffers;
BEGIN
InputBuf := "";
InputDataSize := 0;
InputReceivedSize := 0;
END;
FUNCTION ReceiveLongText(Socket:TCustomWinSocket;MySProc:TMySProc;SafeCalledStr :STRING =""): boolean;
VAR
S: STRING;
RDSize: LongWord;
F: STRING[4];
BEGIN
Result := True;
try
IF SafeCalledStr=""
THEN BEGIN
RDSize := Socket.ReceiveLength;
S := Socket.ReceiveText;
END
ELSE BEGIN
S := SafeCalledStr;
RDSize := length(S);
END;
IF (Length(InputBuf)<4) AND (Length(InputBuf)>0)
THEN BEGIN
//Корректировка, в том случае
S := InputBuf+S;
//если фрагментирован сам заголовок
FlushBuffers;
//блока данных
END;
IF InputBuf=""
THEN
BEGIN
//Самый первый пакет;
F := Copy(S,0,4);
asm
mov EAX,dword ptr F[1];
mov InputDataSize,EAX;
END;
IF InputDataSize=RDSize-4
THEN BEGIN
//Один блок в пакете
InputBuf := Copy(S,5,RDSize-4);
//ни слепки, ни фрагментации нет.
MySProc(InputBuf);
FlushBuffers;
Exit;
END;
IF InputDataSize<RDSize-4
THEN BEGIN
//Пакет слеплен.
InputBuf := Copy(S,5,InputDataSize);
MySProc(InputBuf);
Delete(S,1,InputDataSize+4);
FlushBuffers;
ReceiveLongText(Socket,MySProc,S);
Exit;
END;
IF InputDataSize>RDSize-4
THEN BEGIN
//это ПЕРВЫЙ фрагмент
InputBuf := Copy(S,5,RDSize-4);
//большого пакета
InputReceivedSize := RDSize-4;
END;
END
ELSE BEGIN
//Буфер приема не пуст
//InputBuf :=
IF RDSize+InputReceivedSize=InputDataSize THEN
BEGIN //Получили последний
InputBuf:=InputBuf+Copy(S,0,RDSize);
//фрагмент целиком
MySProc(InputBuf);
//в пакете, данных
FlushBuffers;
// в пакете больше нет
Exit;
END;
IF RDSize+InputReceivedSize<InputDataSize
THEN // Получили
BEGIN
//очередной
InputBuf := InputBuf+Copy(S,0,RDSize);
//фрагмент
InputReceivedSize := InputReceivedSize+RDSize;
Exit;
END;
IF RDSize+InputReceivedSize>InputDataSize
THEN //Поледний фрагмент
BEGIN
// но в пакете есть еще данные - слеплен.
InputBuf := InputBuf+Copy(S,0,InputDataSize-InputReceivedSize);
MySProc(InputBuf);
Delete(S,1,InputDataSize-InputReceivedSize);
FlushBuffers;
ReceiveLongText(Socket,MySProc,S);
END;
END;
except Result := False;
END;
END;
END.
← →
cyborg © (2004-09-18 14:09) [25]Во первых неплохо было бы дописать сокету VAR или Const
SendLongText(Var Socket:TCustomWinSocket; S:STRING)
Это что за ерундень?
asm
mov EAX,TextSize;
mov dword ptr TSSig[1],EAX;
mov byte ptr TSSig[0],4;
END;
Чего делает, зачем надо?
Вместо
Socket.SendBuf(Pointer(S)^,Length(S));
Напиши что-то типа:
Socket.SendBuf(@S[1],Length(S));
И вообще где конкретно ошибка, в чём? Не понятно!
Асамблер тут вообще не нужен, ерундень какая-то.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.049 c