Главная страница
    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.47 MB
Время: 0.014 c
2-1133718967
Developerr
2005-12-04 20:56
2005.12.18
Форму в нижний правый угол


6-1125821792
mm0
2005-09-04 12:16
2005.12.18
Как отправить e-mail без smpt


3-1130581620
Viktop
2005-10-29 14:27
2005.12.18
Грид не отображает данные


6-1125675465
Petay
2005-09-02 19:37
2005.12.18
Подскажите, а можно звук передовать по сети в режиме онлайн


3-1130776360
Tualan
2005-10-31 19:32
2005.12.18
Проектирование БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский