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

Вниз

Кто найдет ошибку?   Найти похожие ветки 

 
Программер_   (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 //&#202;&#238;&#240;&#240;&#229;&#234;&#242;&#232;&#240;&#238;&#226;&#234;&#224;, &#226; &#242;&#238;&#236; &#241;&#235;&#243;&#247;&#224;&#229;
S:=InputBuf+S; //&#229;&#241;&#235;&#232; &#244;&#240;&#224;&#227;&#236;&#229;&#237;&#242;&#232;&#240;&#238;&#226;&#224;&#237; &#241;&#224;&#236; &#231;&#224;&#227;&#238;&#235;&#238;&#226;&#238;&#234;
FlushBuffers; //&#225;&#235;&#238;&#234;&#224; &#228;&#224;&#237;&#237;&#251;&#245;
end;
If InputBuf="" then
  begin //&#209;&#224;&#236;&#251;&#233; &#239;&#229;&#240;&#226;&#251;&#233; &#239;&#224;&#234;&#229;&#242;;
       F:=Copy(S,0,4);
               asm
                       mov EAX,dword ptr F[1];
                       mov InputDataSize,EAX;
                end;

if InputDataSize=RDSize-4 then begin //&#206;&#228;&#232;&#237; &#225;&#235;&#238;&#234; &#226; &#239;&#224;&#234;&#229;&#242;&#229;

InputBuf:=Copy(S,5,RDSize-4); //&#237;&#232; &#241;&#235;&#229;&#239;&#234;&#232;, &#237;&#232; &#244;&#240;&#224;&#227;&#236;&#229;&#237;&#242;&#224;&#246;&#232;&#232; &#237;&#229;&#242;.
MySProc(InputBuf);
FlushBuffers;
Exit;
 end;
if InputDataSize<RDSize-4 then begin //&#207;&#224;&#234;&#229;&#242; &#241;&#235;&#229;&#239;&#235;&#229;&#237;.
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 //&#253;&#242;&#238; &#207;&#197;&#208;&#194;&#219;&#201; &#244;&#240;&#224;&#227;&#236;&#229;&#237;&#242;
   InputBuf:=Copy(S,5,RDSize-4); //&#225;&#238;&#235;&#252;&#248;&#238;&#227;&#238; &#239;&#224;&#234;&#229;&#242;&#224;
   InputReceivedSize:=RDSize-4;
end;
end
else begin //&#193;&#243;&#244;&#229;&#240; &#239;&#240;&#232;&#229;&#236;&#224; &#237;&#229; &#239;&#243;&#241;&#242;
//InputBuf:=
If RDSize+InputReceivedSize=InputDataSize then
       begin //&#207;&#238;&#235;&#243;&#247;&#232;&#235;&#232; &#239;&#238;&#241;&#235;&#229;&#228;&#237;&#232;&#233;
     InputBuf:=InputBuf+Copy(S,0,RDSize); //&#244;&#240;&#224;&#227;&#236;&#229;&#237;&#242; &#246;&#229;&#235;&#232;&#234;&#238;&#236;
     MySProc(InputBuf); //&#226; &#239;&#224;&#234;&#229;&#242;&#229;, &#228;&#224;&#237;&#237;&#251;&#245;
     FlushBuffers; // &#226; &#239;&#224;&#234;&#229;&#242;&#229; &#225;&#238;&#235;&#252;&#248;&#229; &#237;&#229;&#242;
     Exit;
       end;
If RDSize+InputReceivedSize<InputDataSize then // &#207;&#238;&#235;&#243;&#247;&#232;&#235;&#232;
       begin //&#238;&#247;&#229;&#240;&#229;&#228;&#237;&#238;&#233;
    InputBuf:=InputBuf+Copy(S,0,RDSize); //&#244;&#240;&#224;&#227;&#236;&#229;&#237;&#242;
    InputReceivedSize:=InputReceivedSize+RDSize;
    Exit;
       end;
If RDSize+InputReceivedSize>InputDataSize then //&#207;&#238;&#235;&#229;&#228;&#237;&#232;&#233; &#244;&#240;&#224;&#227;&#236;&#229;&#237;&#242;
       begin // &#237;&#238; &#226; &#239;&#224;&#234;&#229;&#242;&#229; &#229;&#241;&#242;&#252; &#229;&#249;&#229; &#228;&#224;&#237;&#237;&#251;&#229; - &#241;&#235;&#229;&#239;&#235;&#229;&#237;.
     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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.235 c
1-1096227578
Gear
2004-09-26 23:39
2004.10.10
Картинка в StatusBar


1-1096277913
DelphiLexx
2004-09-27 13:38
2004.10.10
Зная ID потока получить Handle его окна.


14-1095452403
Chess
2004-09-18 00:20
2004.10.10
Unicode to RichEdit


3-1095202794
S@shka
2004-09-15 02:59
2004.10.10
Почему то упорно не работает UDF


6-1091520584
Максим
2004-08-03 12:09
2004.10.10
The Bat и Delphi