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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2011, 20:02   #1
lol48
Новичок
Джуниор
 
Регистрация: 11.05.2011
Сообщений: 2
По умолчанию Передача файла по сети

В общем есть клиент и сервер.Нужно допилить прогу чтоб могла обмениваца файлами (текстовыми сообщениями может обменивааца) на winsock.
Не до конца разобрался как поместить файл в буфер и вложить в send(...) , и как считать на стороне сервера этот буфер через recv(..) и сохранить этот буфер как файл в папке с програмой.
код клиента.
кнопка Connect:


Цитата:
procedure TSimpleClientForm.BtnConnectClick(S ender: TObject);
var
// Адрес сервера
ServerAddr: TSockAddr;
begin

// Формируем адрес сервера, к которому надо подключиться
FillChar(ServerAddr.sin_zero, SizeOf(ServerAddr.sin_zero), 0);
ServerAddr.sin_family := AF_INET; // AF_INET-асинхронная работа .sin_family – семейство адресации
ServerAddr.sin_addr.S_addr := inet_addr(PChar(EditIPAddress.Text) ); //sin_addr – адрес сервера
// Для совместимости со старыми версиями Delphi приводим
// константу INADDR_NONE к типу u_long
if ServerAddr.sin_addr.S_addr = u_long(INADDR_NONE) then
begin
MessageDlg('Синтаксическая ошибка в IP-адресе', mtError, [mbOK], 0);
Exit;
end;
try
ServerAddr.sin_port := htons(StrToInt(EditPort.Text));// sin_port – порт для подключения
// Создание сокета
FSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //( асинхроная работа, TCP(SOCK_STREAM) - протокол с которым работаем, 0 (IPPROTO_IP) - конкретный протокол) Синхронные сокеты задерживают управление на время выполнения операции, а асинхронные возвращают его немедленно, продолжая выполнение в фоновом режиме, и, закончив работу, уведомляют об этом вызывающий код.
if FSocket = INVALID_SOCKET then
begin
MessageDlg('Ошибка при создании сокета: '#13#10 + GetErrorString, mtError, [mbOK], 0);
Exit;
end;
// Подключение к серверу
if connect(FSocket, ServerAddr, SizeOf(ServerAddr)) < 0 then
begin
MessageDlg('Ошибка при установлении подключения: '#13#10 + GetErrorString, mtError, [mbOK], 0);
// Так как сокет был успешно создан, в случае ошибки его нужно удалить
closesocket(FSocket);
FSocket := 0;
Exit;
end;
// Включаем режим "Соединение установлено"
OnConnect;
except
on EConvertError do
// Это исключение может возникнуть только в одном месте -
// при вызове StrToInt(EditPort.Text)
MessageDlg('"' + EditPort.Text + '" не является целым числом', mtError, [mbOK], 0);
on ERangeError do
// Это исключение может возникнуть только в одном месте -
// при присваивании значения номеру порта
MessageDlg('Номер порта должен лежать в диапазоне 1-65535', mtError, [mbOK], 0);
end;
end;
и кнопка Отправить файл:

Цитата:
procedure TSimpleClientForm.BtnSendFileClick( Sender: TObject);
const
// Данные из буфера сокета мы будем читать порциями.
// Константа BufStep определяет размер порции
BufStep = 10;
var

MS: TMemoryStream; // Буфер для файла
Size: integer;
P: ^Byte;
begin

MS := TMemoryStream.Create; // Создаём буфер для файла
MS.LoadFromFile(Editfilename.Text); // Загружаем файл в буфер

MS.Position := 0; // Переводим каретку в начало файла
P := MS.Memory; // Загружаем в переменную "P" файл

// Отправляем серверу длину файла
if send(fsocket,MS,sizeof(ms),0) < 0 then
begin
MessageDlg('Ошибка при отправке данных серверу: '#13#10 + GetErrorString, mtError, [mbOK], 0);
OnDisconnect;
Exit;
end
else showmessage('ok');
// Отправляем серверу файл

if send(fsocket,P^,Ms.size,0) < 0 then
begin
MessageDlg('Ошибка при отправке данных серверу: '#13#10 + GetErrorString, mtError, [mbOK], 0);
OnDisconnect;
Exit;
end
else showmessage('ok2');
end;
-----------
для сервера сделал также сокет, bind, listen , но вот не могу сделать recv(...) с буфером для файла.
lol48 вне форума Ответить с цитированием
Старый 12.05.2011, 06:24   #2
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

поиск рулит.... мои темы найдите..там есть полностью рабочий код.
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 12.05.2011, 17:57   #3
lol48
Новичок
Джуниор
 
Регистрация: 11.05.2011
Сообщений: 2
По умолчанию

в созданных тобой темах нужной информации не нашел: http://www.programmersforum.ru/searc...earchid=945452
lol48 вне форума Ответить с цитированием
Старый 12.05.2011, 18:18   #4
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

тык.... так файл гарантированно дойдет.
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 13.05.2011, 00:56   #5
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
// Отправляем серверу длину файла
if send(fsocket,MS,sizeof(ms),0) < 0 then
Ничего подобного. Чушь ты ему отправляешь, а не длину файла.

Второй параметр требует адрес буфера с данными, которые нужно отправвить, а ты вместо этого указываешь адрес объекта.

Третий параметр - размер данных в этом буфере, а ты вместо этого указываешь размер адреса объекта (в Win32 он ВСЕГДА равен 4 байта)
mss вне форума Ответить с цитированием
Старый 02.07.2011, 19:31   #6
ser_joy
Новичок
Джуниор
 
Регистрация: 02.07.2011
Сообщений: 2
По умолчанию

вот тебе рабочая прого с исходником и не парся!
http://depositfiles.com/files/xnvzz0q9e
ser_joy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача файла по локальной сети free6878 Помощь студентам 15 04.03.2012 10:22
Передача файла по сети sicil_proger C++ Builder 4 04.02.2011 13:06
Передача файлов по сети Sparky Общие вопросы Delphi 5 31.10.2009 19:34