Вот даже решил набросать примерный код-)
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls;
type TForm1 = class(TForm) Memo1: TMemo; cs: TClientSocket; ss: TServerSocket; procedure FormCreate(Sender: TObject); procedure ssClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ssClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure csRead(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin ss.Port := 4900; ss.Open; end;
procedure TForm1.ssClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin cs.Port := 4899; cs.Address := '127.0.0.1'; Memo1.Lines.Add('Client connect, Address='+Socket.RemoteAddress); end;
procedure TForm1.ssClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add('Client disconnect, Address='+Socket.RemoteAddress); cs.Close; end;
procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket); var s: String; Len: Integer; begin if not cs.Active then begin cs.Open; while not cs.Active do Application.ProcessMessages; end;
repeat Len := Socket.ReceiveLength; Memo1.Lines.Add('ss: Принято байт '+IntToStr(Len)); if Len=0 then break; SetLength(s,Len); Socket.ReceiveBuf(s[1],Len); cs.Socket.SendBuf(s[1],Len); until Len=0; end;
procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket); var s: String; Len: Integer; begin repeat Len := Socket.ReceiveLength; Memo1.Lines.Add('cs: Принято байт '+IntToStr(Len)); if Len=0 then break; SetLength(s,Len); Socket.ReceiveBuf(s[1],Len); ss.Socket.Connections[0].SendBuf(s[1],Len); until Len=0; end;
end.
|
Конечно, код сыроват(нет обработки ошибок, например), но рабочий. |