![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отправка данных от 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