Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];

Вниз

WinSock   Найти похожие ветки 

 
ferrik   (2003-03-10 20:19) [0]

Когда отправляншь SendText несколько раз подряд(сразу,вместе) они как бы кучкуются в одну строку как можно сделать чтобы приходила не 1 строка а например все 5 по раздельности...


 
dimich1978   (2003-03-11 09:22) [1]

unit LongDataTransfer;

interface
uses ScktComp;
Type TMySProc = procedure(const S:AnsiString) of object;
function SendLongText(Socket:TCustomWinSocket; S:ansiString):boolean;
function ReceiveLongText(Socket:TCustomWinSocket;MySProc:TMySProc;SafeCalledStr :string = ""):boolean;


var
InputBuf : ansiString;
InputDataSize : LongWord;
InputReceivedSize : LongWord;

implementation
function SendLongText(Socket:TCustomWinSocket; S:ansiString):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 :ansistring = ""):boolean;
var
S:ansiString;
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.

Пример использования
procedure tform1.DataProcessing(const S:ansiString);
begin
SendLongText(ClientSocket1.Socket,"Go");
SendLongText(ClientSocket1.Socket,"Stop");
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
ReceiveLongText(Socket,DataProcessing);
end;



 
ferrik   (2003-03-11 18:43) [2]

Спасибо!!!!!!!!!


 
MikeP   (2003-03-11 20:19) [3]

ужас какой, сразу видно руку мастера, главное пару ассемблерных инструкций вставить и успех гарантирован


 
Malder   (2003-03-11 23:50) [4]

dimich1978, вау, ты где такое выкопал ?

ferrik, ты типа ничего не понял, но все равно решил сказать спасибо ?

Или ЭТО тебе помогло ?


 
Digitman   (2003-03-12 08:46) [5]


> dimich1978


не будет это работать !

особливо - в части "извращений" с asm-блоком)


 
dimich1978   (2003-03-12 08:48) [6]

Да ладно, по крайней мере это все работает.
А ВЫ что нибудь бы хоть предложили. Как вижу одни ухмылки и ничего более, СТЫД какой то


 
dimich1978   (2003-03-12 08:50) [7]

Нет я не согласен. ВСЕ РАБОТАЕТ и НИЧЕГО НЕ ГЛЮКАЛО. Хотя может быть я и неправ в чем то. Тогда скажите в чем именно.


 
ws   (2003-03-12 09:07) [8]

Вау!!! Ну ты и выдал... По-моему, я сделал проще - имеется очередь. Посылать сообщения с сигнатурой конца (например #1). На OnClientRead - AddToQueue (добавление в очередь посимвольно). Если конец встретился - то AddToQueue вызывает ParseMessage и первая строка из очереди уходит.


 
Digitman   (2003-03-12 09:16) [9]

начнем с того, что 4-байтный префикс размера данных, который сформирован в двоичном виде в буфере TSSig ты пытаешься интерпретировать как стр.данные в операции конкатенации строк String(TSSig+S);


 
Digitman   (2003-03-12 09:18) [10]

и - уменя уже язык скоро отсохнет - ГДЕ ОБРАБОТКА СОБЫТИЯ On[Client]Write() на стороне передатчика ???


 
Digitman   (2003-03-12 09:24) [11]

попробуй с пом.своего кода послать строку длиной 257 символов - приемник получит 1 символ ! если вообще получит (в условиях, когда передатчик и приемник разнесены по разным хостам в разных подсетях глоб.сети)


 
dimich1978   (2003-03-12 09:53) [12]

Есть недостатки согласен, вот это другой разговор. Сказать одно, а вот уточнить где я направ это другое, за это огромное спасибо Digitman"у.
:-)))))


 
Malder   (2003-03-12 17:16) [13]

Н-Е-Д-О-С-Т-А-Т-О-К ?

Я выпал в осадок...


 
ferrik   (2003-03-12 19:29) [14]

Все гавкают а альтернатив нет.


 
Polevi   (2003-03-12 19:43) [15]

>ferrik © (12.03.03 19:29)
альтернативы есть, тебе надо попробовать вернуться к решению данной задачи через годик учебы


 
Digitman   (2003-03-13 08:45) [16]


> ferrik


Какая тебе еще "альтернатива" нужна ?? Вникай в код от <dimich1978> ! И будет тебе счастье)..

Даже при всех упомянутых "недостатках" этого алгоритма смысл в его верен :
- передатчик посылает данные нужного размера, предваряемые 4-байтным префиксом этого размера;

- приемник считывает 4-байтный префикс и уже зная размер следом передаваемых данных (размер передан приемнику в префиксе) считывает собственно данные, записывая их в отдельную "строку"

И всех делов !)

p.s.
Заодно сходи на http://book.itep.ru и проштудируй этот ресурс от корки до корки, хотя бы в части тем "TCP-протокол" и "Winsock". Изучение особенностей TCP-протокола даст тебе понимание того, что этот протокол - поточный, и деление исходящего/входящего потока на передаваемые/принимаемые "дейтаграммы" возлагаются на прикладную программу, а не на систему



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

Форум: "Сети";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
3-22996
lustr
2003-04-17 16:37
2003.05.08
ошибка при конекте через TDataBase


4-23414
stream
2003-03-07 11:46
2003.05.08
сохранение HBITMAP в файл


3-23016
NiBL'S
2003-04-18 09:31
2003.05.08
Можно ли обойти пароль в базе gdb?


1-23091
Black
2003-04-26 13:35
2003.05.08
Мой компьютер в OpenDialog1


14-23383
John
2003-04-21 17:05
2003.05.08
Можно ли восстановить зрение?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский