Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

Отправка данных от ServerSocket к множеству ClientSocket   Найти похожие ветки 

 
kivadim   (2005-09-04 22:12) [0]

Подскажите кто знает.

Клиентское приложение через компонент ClientSocket отправляет файлы ServerSocket-у в серверном приложении.
В серверном приложении при получении файлов через тот же ServerSocket отправляет подвтерждение о приеме файлов
обратно клиентскому приложению

Например:
ServerSocket1.Socket.Connections[0].SendStream(TFileStream.Create("c:\1.txt", fmOpenRead or fmShareDenyWrite));

Но как отправлять подтверждения в случае если клиентов несколько, т.е. не могу понять как определять какой клиент
какой номер индекса имеет в ServerSocket1.Socket.Connections[]... ?


 
Slym ©   (2005-09-05 05:01) [1]

Сокет какой? Block/NotBlock


 
Ozone ©   (2005-09-05 06:39) [2]

Что мешает различать по IP ?


 
kivadim   (2005-09-05 10:02) [3]

>> Slym ©   (05.09.05 05:01) [1]
да забыл уточнить что NotBlock

>>Ozone ©   (05.09.05 06:39) [2]
да я тоже думаю что по IP, но как сказать ServerSocket-у отправить именно по опред. IP адресу?


 
Slym ©   (2005-09-05 10:53) [4]

Тогда мне интересно увидеть как ты файлы собираешь при одновременном коннекте нескольких клиентов, если ты не знаешь от кого куски файла валятся.


 
kivadim   (2005-09-05 15:14) [5]

Ну у меня каждый клиент получается как-бы в отдельном потоке благодаря след. структурам (код найден на просторах инета :) )


type
 // Заголовок файла,содержащий его имя и размер
 TFileDescriptor = packed record
    SaveAs : ShortString; //Имя файла
    Size   : int64;       // Его размер
    IP_address : ShortString;
 end;

 // Управляющая структура клиента
 TFServerClient = class(TServerClientWinSocket)
 private
   FDescriptor : TFileDescriptor; // Заголовок вновьпринимаемого файла
   FFile       : boolean; // Признак приема тела файла
   FStream     : TStream; // Stream через который мы будем писать файл
   GClose,                // Признак закрывания соединения
   SClose      : boolean; // Признак принудительного закрывания соединения
   FTime       : DWORD;   // Время жизни
   FIdleTime   : DWORD;   // Время неактивности
   FCount      : integer; // счетчик числа переданных файлов
   FDSize      : integer;  // Количество байт заголовка
   Buffer      : array[0..BUFF_SIZE - 1] of byte;
   ClientFDir  : string;      // Папка для сохраниения принятых файлов
   lv_id       : integer;
   procedure BeginFile;
   procedure EndFile;
   procedure SelfClose;
   procedure GraceClose;
   function  CheckDescriptor : boolean;
 public
   constructor Create(Socket: TSocket; ServerWinSocket: TServerWinSocket;
                      const AClientFDir : string);
   destructor destroy; override;
   procedure  ProcessRead;
   procedure  TimerTick(MS : DWORD);
 end;

...

procedure TForm1.ServerSocket1GetSocket(Sender: TObject; Socket: Integer;
 var ClientSocket: TServerClientWinSocket);
var Sa : TSockAddrIn;
   SaLen : integer;
   CName : string;
begin
 SaLen := Sizeof(Sa);
 ZeroMemory(@Sa, SaLen);
 if getpeername(Socket, Sa, SaLen)<> SOCKET_ERROR then
   CName := inet_ntoa(Sa.sin_addr)+"\"
 else
   CName := "";
 CName := ClientFilesDir + CName;
 ForceDirectories(CName);
 ClientSocket := TFServerClient.Create(Socket, Sender as TServerWinSocket,CName);
end;

...

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
begin
//процедура записи из сокета в файл    
(Socket as TFServerClient).ProcessRead;
end;

...


 
Digitman ©   (2005-09-05 16:50) [6]


> как-бы в отдельном потоке


никакими потоками судя, по приведенному коду, здесь и не пахнет.


> код найден на просторах инета


ты уже разобрался, что в этом коде к чему и для чего ?


 
Slym ©   (2005-09-06 08:49) [7]

В данном случае будет проще сделать ThreadBlock и не париться


 
kivadim   (2005-09-06 11:21) [8]

>> ты уже разобрался, что в этом коде к чему и для чего ?
да вроде разобрался.

>> Slym ©   (06.09.05 08:49) [7]
ну не знаю толковых примеров про ThreadBlock не находил.

а то что спрашивал можно решить примерно так:

procedure TForm1.SendFile(S_HNDL: integer);
var i: integer;
begin
   try
     for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
     begin
      if ServerSocket1.Socket.Connections[i].SocketHandle = S_HNDL then
       begin
       ServerSocket1.Socket.Connections[i].SendStream(TFileStream.Create("c:\1.txt", fmOpenRead or fmShareDenyWrite));
       end;
     end;
   except
   end;
end;


 
Slym ©   (2005-09-06 14:32) [9]

kivadim   (06.09.05 11:21) [8]
ну не знаю толковых примеров про ThreadBlock не находил.

Плохо искал

Мда... Пока один файл грузится другие висят? Правильно так и должно быть



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

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.069 c
2-1133373971
dimka_sh
2005-11-30 21:06
2005.12.18
Разрешение экрана


14-1132636419
TUser
2005-11-22 08:13
2005.12.18
Подключить USB хард к двум компьютерам


2-1132992605
312Kbps
2005-11-26 11:10
2005.12.18
TWebBrowser


3-1130856634
Mouse_Rat
2005-11-01 17:50
2005.12.18
Backup таблицы из FireBird


2-1133175211
LionMen
2005-11-28 13:53
2005.12.18
Расшифровка файла