Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

Отправка данных от 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.013 c
2-1132847602
yrbanchik
2005-11-24 18:53
2005.12.18
светомузыка


2-1133256755
saer
2005-11-29 12:32
2005.12.18
Изменение яркости


1-1132798674
konrads
2005-11-24 05:17
2005.12.18
Определить сменный диск


2-1133603114
Glex
2005-12-03 12:45
2005.12.18
HexToBin - pozhalujsta, o4en nuzhno


14-1132926223
TohaNik
2005-11-25 16:43
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский