![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WinSock [D6, WinME]
ferrik © (2003-03-10 20:19:00)Когда отправляншь SendText несколько раз подряд(сразу,вместе) они как бы кучкуются в одну строку как можно сделать чтобы приходила не 1 строка а например все 5 по раздельности...
Digitman (2003-03-13 08:45:00) [1]
> ferrik
Какая тебе еще "альтернатива" нужна ?? Вникай в код от <dimich1978> ! И будет тебе счастье)..
Даже при всех упомянутых "недостатках" этого алгоритма смысл в его верен :
- передатчик посылает данные нужного размера, предваряемые 4-байтным префиксом этого размера;
- приемник считывает 4-байтный префикс и уже зная размер следом передаваемых данных (размер передан приемнику в префиксе) считывает собственно данные, записывая их в отдельную "строку"
И всех делов !)
p.s.
Заодно сходи на http://book.itep.ruи проштудируй этот ресурс от корки до корки, хотя бы в части тем "TCP-протокол" и "Winsock". Изучение особенностей TCP-протокола даст тебе понимание того, что этот протокол - поточный, и деление исходящего/входящего потока на передаваемые/принимаемые "дейтаграммы" возлагаются на прикладную программу, а не на систему
Polevi (2003-03-12 19:43:00) [2]>ferrik © (12.03.03 19:29)
альтернативы есть, тебе надо попробовать вернуться к решению данной задачи через годик учебы
ferrik (2003-03-12 19:29:00) [3]Все гавкают а альтернатив нет.
Malder (2003-03-12 17:16:00) [4]Н-Е-Д-О-С-Т-А-Т-О-К ?
Я выпал в осадок...
dimich1978 (2003-03-12 09:53:00) [5]Есть недостатки согласен, вот это другой разговор. Сказать одно, а вот уточнить где я направ это другое, за это огромное спасибо Digitman"у.
:-)))))
Digitman (2003-03-12 09:24:00) [6]попробуй с пом.своего кода послать строку длиной 257 символов - приемник получит 1 символ ! если вообще получит (в условиях, когда передатчик и приемник разнесены по разным хостам в разных подсетях глоб.сети)
Digitman (2003-03-12 09:18:00) [7]и - уменя уже язык скоро отсохнет - ГДЕ ОБРАБОТКА СОБЫТИЯ On[Client]Write() на стороне передатчика ???
Digitman (2003-03-12 09:16:00) [8]начнем с того, что 4-байтный префикс размера данных, который сформирован в двоичном виде в буфере TSSig ты пытаешься интерпретировать как стр.данные в операции конкатенации строк String(TSSig+S);
ws (2003-03-12 09:07:00) [9]Вау!!! Ну ты и выдал... По-моему, я сделал проще - имеется очередь. Посылать сообщения с сигнатурой конца (например #1). На OnClientRead - AddToQueue (добавление в очередь посимвольно). Если конец встретился - то AddToQueue вызывает ParseMessage и первая строка из очереди уходит.
dimich1978 (2003-03-12 08:50:00) [10]Нет я не согласен. ВСЕ РАБОТАЕТ и НИЧЕГО НЕ ГЛЮКАЛО. Хотя может быть я и неправ в чем то. Тогда скажите в чем именно.
dimich1978 (2003-03-12 08:48:00) [11]Да ладно, по крайней мере это все работает.
А ВЫ что нибудь бы хоть предложили. Как вижу одни ухмылки и ничего более, СТЫД какой то
Digitman (2003-03-12 08:46:00) [12]
> dimich1978
не будет это работать !
особливо - в части "извращений" с asm-блоком)
Malder (2003-03-11 23:50:00) [13]dimich1978, вау, ты где такое выкопал ?
ferrik, ты типа ничего не понял, но все равно решил сказать спасибо ?
Или ЭТО тебе помогло ?
MikeP (2003-03-11 20:19:00) [14]ужас какой, сразу видно руку мастера, главное пару ассемблерных инструкций вставить и успех гарантирован
ferrik (2003-03-11 18:43:00) [15]Спасибо!!!!!!!!!
dimich1978 (2003-03-11 09:22:00) [16]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;