Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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 //&#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.049 c
14-1095669902
Карелин Артем
2004-09-20 12:45
2004.10.10
Галлы vs Римляне. Было ли такое?


14-1095777403
}|{yk
2004-09-21 18:36
2004.10.10
Не надо пожалуйста любых обвинений


10-1028118297
LeS
2002-07-31 16:24
2004.10.10
Помогите начинающему. Регистрация ком.


14-1095941853
Knight
2004-09-23 16:17
2004.10.10
Мигает экран при загрузке рабочего стола после чего...


1-1096008200
eagle2002
2004-09-24 10:43
2004.10.10
Запуск notepad





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский