Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2008, 16:15   #1
dns-s
 
Регистрация: 23.02.2008
Сообщений: 4
По умолчанию Передача функции TServerSocket и TFileStream

Возможно я щас задам очень глупый вопрос, но заранее прошу извенений - что-то я недогоняю..
Я пишу смесь чата с почтовиком, если так можно выразиться, (сервер с несколькими клиентами) с возможностью отправки файлов.
на форме 3 элемента управления ServerSocket1, ServerSocket2, ServerSocket3 соответственно (это не на главной форме и только для файлов). Предполагается что пользователь шлет файлы на тот сокет, который сейчас свободен. Вот код одной из процедур, которая в зависимости от того какой порт свободен создает один из трех потоков (для каждого сервера сделал свою глобальную переменную потока):

procedure TFormFiles.CreateStream(ctFromNik, ctToNik, ctFile : String;
ctFileSize : LongWord; ctCurServSocket : TServerSocket;
ctCurFStream : TFileStream);
var
homeDir: String;
begin
homeDir := ExtractFilePath(Application.ExeName ) + 'ReceiveFiles\';

if not DirectoryExists(homeDir+ctToNik) then
begin
CreateDirectory(PChar(homeDir+ctToN ik+'\Temp\'), nil);
end;

ctCurFStream := nil; //!!!!!!!
ctCurFStream := TFileStream.Create //!!!!
(homeDir+ctToNik+'\Temp\'+ctFile, fmCreate or fmShareDenyWrite);

ctCurServSocket.Active := True;
end;

Вызываю процедуру так
CreateStream(strFromNik, strToNik, strFile, lwFileSize,
ServerSocket1, FStream1);

FStream1 - это глобальная переменння на форме

Я вот думаю это наверное надо таким образом через указатели делать? не подскажите?

А еще один ворпос - как в событии ServerSocket1ClientRead отличить когда приходят сообщения, а когда файлы (потоки тобишь), т.е. когда клиент шлет SendText, а когда SendStream?
dns-s вне форума Ответить с цитированием
Старый 26.03.2008, 16:13   #2
dns-s
 
Регистрация: 23.02.2008
Сообщений: 4
По умолчанию

В общем я уже сам разобрался. На счет передачи в функцию объектов TServerSocket и TFileStream в качестве параметров - это я просто обошел. А вот на счет второго - как определить когда клиент шлет SendText, а когда SendStream в ServerSocket1ClientRead - сделал следующим образом:

procedure TFormFiles.ServerSocketFile1ClientR ead(Sender: TObject;
Socket: TCustomWinSocket);
var
iLen,
iFileSize: Integer;
Bfr: Pointer;
rText,
rCmd: String;
{FStream, gFileSize и homeDir - Глобальные переменные}
begin
if Socket.ReceiveLength <> 0 then
begin
iLen := Socket.ReceiveLength;

GetMem(Bfr, iLen);
try
Socket.ReceiveBuf(Bfr^, iLen);

if bfr = nil then
exit;
rText := String(copy(String(bfr), 1, iLen));

//В качестве специальных символов используем #166+#166
//Если они есть, то это сообщение, если нет то файл
rCmd := copy(rText, 1, pos(#166+#166, rText)-1);
if rCmd <> '' then
begin //Пользователь собирается слать файлы
if rCmd = 'fs|' then //Прищла команда fs|имя_файла|размер
begin
delete(rText, 1, pos('|', rText));
rCmd := copy(rText, 1, pos('|', rText)-1); //имя_файла
delete(rText, 1, pos('|', rText)); //размер
//копирую без конечных #166+#166
gFileSize := StrToInt(copy(rText, 1, pos(#166+#166, rText)-1));

FStream := TFileStream.Create
(homeDir + rCmd {Путь к файлу}, fmCreate or fmShareDenyWrite);

end
else if rCmd = 'fr0|' then
begin //Больше файлов не будет - делаем сервер неактивным
ServerSocketFile1.Active := False;
end
end
else //Пришел файл
begin
FStream.Write(Bfr^, iLen);
end;
//Если файл пришел полностью то освобождаем поток
if FStream.Size = gFileSize1 then
begin
formMain.ListBoxLog.Items.Add('Прие м файла '+
ExtractFileName(FStream1.FileName)+ ' закончен');

FStream.Free;
FStream := nil;

gFileSize := 0;
end;
finally
FreeMem(Bfr);
bfr := nil;
end;
end;
end;

Только если вдруг клиент будет слать текстовый файлик с двумя специальными символами (#166+#166). То возникает баг..

Если кто-то знает как можно реализовать более умным способом подскажите плиз.

Последний раз редактировалось dns-s; 26.03.2008 в 16:19.
dns-s вне форума Ответить с цитированием
Старый 26.03.2008, 21:15   #3
ERASERROR
Форумчанин
 
Регистрация: 15.01.2008
Сообщений: 117
По умолчанию

Перед отправкой файла, посылается текст допустим 'SendFile<размер файла>#0', после получатель выбирает размер файла, и получает его. p.s. более подробно это описано в книги Фленова "Delphi глазами хакера"
ERASERROR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача файла через TServerSocket и TClientSocket Vanya Работа с сетью в Delphi 10 08.04.2008 18:12
проблемы с TFileStream andrey4623 Общие вопросы Delphi 9 01.11.2007 20:44
сохранение изображения с TFileStream andrey4623 Общие вопросы Delphi 10 20.10.2007 20:28
TFilestream UnD)eaD)Snake Win Api 1 27.09.2007 21:22