Форум: "Сети";
Текущий архив: 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.47 MB
Время: 0.014 c