Форум: "Сети";
Текущий архив: 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