Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отправка данных от ServerSocket к множеству ClientSocket [D6, WinXP]


kivadim ©   (2005-09-04 22:12:00) 

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

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

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

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


Slym   (2005-09-06 14:32:00) [1]

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

Плохо искал

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


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

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

>> 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 08:49:00) [3]

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


Digitman   (2005-09-05 16:50:00) [4]


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


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


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


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


kivadim   (2005-09-05 15:14:00) [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;

...


Slym   (2005-09-05 10:53:00) [6]

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


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

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

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


Ozone   (2005-09-05 06:39:00) [8]

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


Slym   (2005-09-05 05:01:00) [9]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо