Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


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

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


Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2008, 17:44   #1
Vanya
Пользователь
 
Аватар для Vanya
 
Регистрация: 02.04.2008
Сообщений: 10
Хорошо Передача файла через TServerSocket и TClientSocket

Возникла потребность организовать передачу файлов в локалке
Как это можно реализовать через TServerSocket и TClientSocket?
Напишите по подробнее а то я только начинаю изучать програмирование и не все понимаю
Спасибо
Vanya вне форума Ответить с цитированием
Старый 03.04.2008, 17:47   #2
ZhekON
Форумчанин
 
Аватар для ZhekON
 
Регистрация: 24.01.2007
Сообщений: 323
По умолчанию

у мну такая же проблема) токо мне надо передать строку(сообщение) используя айпишник другого компа или чот в етом роде) я сам ещё непонимаю как ето организоватЬ) вопрос вродебы не сложный но для новичка...
Всё проще чем вы думаете, нужно только правильно подойти к тому или иному вопросу?
ZhekON вне форума Ответить с цитированием
Старый 03.04.2008, 18:01   #3
Vanya
Пользователь
 
Аватар для Vanya
 
Регистрация: 02.04.2008
Сообщений: 10
По умолчанию

ZhekON посмотри в блоге там это есть
http://pblog.ru/?p=91
Vanya вне форума Ответить с цитированием
Старый 03.04.2008, 20:57   #4
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Вот пример передачи файла :

Отправка файлов.rar
Всегда рад помочь!

Последний раз редактировалось Terran; 03.04.2008 в 21:08.
Terran вне форума Ответить с цитированием
Старый 04.04.2008, 13:44   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Работу с потоками учим... идем учим Api + WinSock ))) После изучения и понимания оргиназовываем свой поток от TThread переопределив процедуру Execute; в которой пишем на блокирующих сокетах прием данных из сокета при помощи recv и последующей записи куда вам угодно полученного буфера... после получения ошибки, пустого буфера или окончания получения файла закрываем соединение удаляем все буфера радуемся ))) сообщяем по событию из потока главному потоку об окончании процедуры.... Вкратце
BOBAH13 вне форума Ответить с цитированием
Старый 04.04.2008, 14:54   #6
Vanya
Пользователь
 
Аватар для Vanya
 
Регистрация: 02.04.2008
Сообщений: 10
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Работу с потоками учим... идем учим Api + WinSock )))
Есть ссылки на учебники???
Чем тебе не нравиться ServerSocket и ClientSocket?
Vanya вне форума Ответить с цитированием
Старый 04.04.2008, 22:38   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Начнем с того, на чем основаны TServer~ClientSocket ? WinSock... Учебник самый лучший по Api WinSock -> MSDN да и полно материала в сети сетевому программированию. Ненравиться, потому что контроль над всем процессом скрыт от моих глаз в недрах компонента, а на более низком уровне можно обработать больше информации и таким образом избежать дальнейших проблем ( освобождения ресурсов, закрытие сокета и т.п. )
BOBAH13 вне форума Ответить с цитированием
Старый 06.04.2008, 22:05   #8
Vanya
Пользователь
 
Аватар для Vanya
 
Регистрация: 02.04.2008
Сообщений: 10
По умолчанию

Вован13 Ты не мог бы выложить исходники передачи файлов с использованием WinSock
Vanya вне форума Ответить с цитированием
Старый 07.04.2008, 07:17   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ну вот написал сейчас. Может и ошибка где попадется ))

Код:
{ Описание класса }

  TSockMan = class(TThread)
  private
    FSocket: TSocket;
    FSended: Integer;
    FBuffer: Pointer;
    FBufLen: Integer;
    FLastError: Integer;
    FOnFinished: TNotifyEvent;
    FOnError: TNotifyEvent;

    procedure DoFinished;
    procedure DoError;
  protected
    procedure Execute; override;
  public
    constructor Create;
    destructor Destroy; override;

    procedure Send(Socket: TSocket; var Buf; Count: Integer);

    property OnError: TNotifyEvent read FOnError write FOnError;
    property OnFinished: TNotifyEvent read FOnFinished write FOnFinished;
    property LastError: Integer read FLastError;
  end;

implementation

{ TSockMan }

constructor TSockMan.Create;
begin
  inherited Create(True);
  FSocket := INVALID_SOCKET;
end;

destructor TSockMan.Destroy;
begin
  inherited Destroy;
end;

procedure TSockMan.DoFinished;
begin
  if Assigned(FOnFinished) then
    FOnFinished(Self);
end;

procedure TSockMan.DoError;
begin
  if Assigned(FOnError) then
    FOnError(Self);
end;

procedure TSockMan.Send(Socket: TSocket; var Buf; Count: Integer);
begin
  FSocket := Socket;
  FBuffer := @Buf;
  FBufLen := Count;
  FSended := 0;
  Resume;
end;

procedure TSockMan.Execute;
var
  FDSet: TFDSet;
  TimeVal: TTimeVal;
  Len: Integer;
begin
  FreeOnTerminate := True;
  while not Terminated and (FSocket <> INVALID_SOCKET) do
  begin
    FD_ZERO(FDSet);
    FD_SET(FSocket, FDSet);
    TimeVal.tv_sec := 0;
    TimeVal.tv_usec := 10;
    if (select(0, @FDSet, NIL, NIL, @TimeVal) < 1) then
    begin
      while True do
      begin
        Len := WinSock.send(FSocket, Pointer(Integer(FBuffer) + FSended)^,
          FBufLen - FSended, 0);
        if Len = SOCKET_ERROR then
        begin
          FLastError := WSAGetLastError;
          Synchronize(DoError);
          Break;
        end;
        inc(FSended, Len);
      end;
    end;
    if (FSended = FBufLen) then
    begin
      Synchronize(DoFinished);
      Break;
    end;
  end;
end;
Использование
Код:
{
Допутсим Buffer переменная содержащая данные отсылаемые
Len переменная содержащая размер отсылаемых данных
S переменная - индефикатор сокета куда шлем все данные
OnFinished - процедура обработчик окончания отправки данных сокету
OnError - процедура обработчик ошибки во время отправки данных сокету
По событию OnError смотрим LastError следуя из 
procedure OnError(Sender: TObject); 
где LastError = TSockMan(Self).LastError; 
}
var
  SockMan: TSockMan;
begin
  SockMan := TSockMan.Create;
  // здесь если надо, присваиваем обработчики 
  // даннаого класса TSockMan
  SockMan.Send(S, Buffer, Len);
end;
незачто
BOBAH13 вне форума Ответить с цитированием
Старый 08.04.2008, 10:38   #10
Vanya
Пользователь
 
Аватар для Vanya
 
Регистрация: 02.04.2008
Сообщений: 10
По умолчанию

А принимать как???Я понял что так:
Создаеш поток TThread
В Execut запускаеш бесконечный цикл в котором принимаеш файл recv
Тогда у меня такой вопрос как узнать размер пришедшего файла что бы выделить под него необходимое место???
Vanya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме 20000 рублей в месяц

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компоненты TServerSocket и TClientSocket Vadim Компоненты Delphi 5 15.03.2010 20:34
Передача функции TServerSocket и TFileStream dns-s Работа с сетью в Delphi 2 26.03.2008 21:15
проблема с TServerSocket и с TClientSocket DOLBY Работа с сетью в Delphi 56 14.01.2008 16:12
Проблема с TClientSocket, TServerSocket PLOT_HD Работа с сетью в Delphi 4 11.08.2007 16:03


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS