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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2014, 18:37   #1
Максикок
Пользователь
 
Регистрация: 07.10.2010
Сообщений: 71
По умолчанию Программа клиент-сервер

Вообщем задача такая,реализовать 2 программы(клиент,сервер) по запросу клиента(выбираем файл на сервере,вводим в поле Edit)копируем этот файл с сервера на клиент(с одного компьютера на другой)а затем так же по запросу клиента можем удалить его. Я реализовал только удаление по запросу клиента. Помогите пожалуйста реализовать копирование, в программе клиент вводим имя файла на сервере и от туда идет копирование на компьютер клиент.

программа клиент
Код:
#include <vcl.h>
#pragma hdrstop

#include <winsock2.h>
#include <process.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
SOCKET SocketServer;
SOCKADDR_IN SockAdrServer,local;
int PORT = 5150;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void WaitMessage(void* pParams)
{
SOCKET SocketServer;
SOCKADDR_IN SockAdrServer;
SocketServer = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
if(SocketServer == INVALID_SOCKET)
        {
       ShowMessage("WSASocket(): " + IntToStr(WSAGetLastError()));
        }
SockAdrServer.sin_family = AF_INET;
SockAdrServer.sin_addr.s_addr = INADDR_ANY;
SockAdrServer.sin_port = PORT;
WSAHtons(SocketServer, SockAdrServer.sin_port, &SockAdrServer.sin_port);

WSAHtonl(SocketServer, SockAdrServer.sin_addr.s_addr, &SockAdrServer.sin_addr.s_addr);

if(bind(SocketServer, (SOCKADDR *) &SockAdrServer, sizeof(SockAdrServer)) != 0)
        {
        ShowMessage("bind(): " + IntToStr(WSAGetLastError()));
        }
WSABUF RecvBuf;
RecvBuf.buf = new char[512];
RecvBuf.len = 512;
DWORD ByteRecv;
int SizeSockAdrServer = sizeof(SockAdrServer);
DWORD flags = 0;
if(WSARecvFrom(SocketServer, &RecvBuf, 1, &ByteRecv, &flags, (SOCKADDR *) &SockAdrServer, &SizeSockAdrServer, NULL, NULL) != 0)
        {
        ShowMessage("WSARecvFrom(): " + IntToStr(WSAGetLastError()));
        }
Form1->Edit2->Text = AnsiString(RecvBuf.buf);//результат(файл удален,либо файл не найден)
delete[] RecvBuf.buf;
closesocket(SocketServer);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
WSAData wsd;
if(WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
        {
        ShowMessage("Не удалость загрузить WinSock.dll");
        return;
        }
SocketServer = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
if(SocketServer == INVALID_SOCKET)
        {
        ShowMessage("WSASocket(): " + IntToStr(WSAGetLastError()));
        }
SockAdrServer.sin_family = AF_INET;
SockAdrServer.sin_addr.s_addr = inet_addr(Edit4->Text.c_str()); //IP- адрес
SockAdrServer.sin_port = PORT;
WSAHtons(SocketServer, SockAdrServer.sin_port, &SockAdrServer.sin_port);

local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = PORT;

if(bind(SocketServer,(SOCKADDR*)&local,sizeof(local))==0);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SOCKET SocketServer;
SOCKADDR_IN SockAdrServer;
SocketServer = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
if(SocketServer == INVALID_SOCKET)
        {
        ShowMessage("WSASocket(): " + IntToStr(WSAGetLastError()));
        }
SockAdrServer.sin_family = AF_INET;
SockAdrServer.sin_addr.s_addr = inet_addr(Edit4->Text.c_str());  //IP- адрес
SockAdrServer.sin_port = PORT;
WSAHtons(SocketServer, SockAdrServer.sin_port, &SockAdrServer.sin_port);

WSABUF SendBuf;
SendBuf.buf = new char[256];
strcpy(SendBuf.buf, Edit1->Text.c_str()); //имя файла на сервере
SendBuf.len = 256;
DWORD ByteSend;
if(WSASendTo(SocketServer, &SendBuf, 1, &ByteSend, 0, (SOCKADDR *) &SockAdrServer, sizeof(SockAdrServer), NULL, NULL) != 0)
        {
        ShowMessage("WSASendTo(): " + IntToStr(WSAGetLastError()));
        }
delete[] SendBuf.buf;
closesocket(SocketServer);
_beginthread(WaitMessage, 0, NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
closesocket(SocketServer);
}
Максикок вне форума Ответить с цитированием
Старый 03.06.2014, 18:37   #2
Максикок
Пользователь
 
Регистрация: 07.10.2010
Сообщений: 71
По умолчанию

Программа сервер
Код:
#include <vcl.h>
#pragma hdrstop

#include <winsock2.h>
#include <dir.h>
#include <process.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int PORT = 5150;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void WaitMessage(void* pParams)
{
SOCKET SocketClient;
SOCKADDR_IN SockAdrClient;
SocketClient = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
if(SocketClient == INVALID_SOCKET)
        {
        ShowMessage("WSASocket(): " + IntToStr(WSAGetLastError()));
        return;
        }

unsigned int ul = 1;
if(ioctlsocket(SocketClient, FIONBIO, (unsigned long *) &ul) != 0)
        {
        ShowMessage("ioctlsocket(): " + IntToStr(WSAGetLastError()));
        return;
        }

SockAdrClient.sin_family = AF_INET;
SockAdrClient.sin_addr.s_addr = INADDR_ANY;
SockAdrClient.sin_port = PORT;
if(WSAHtons(SocketClient, SockAdrClient.sin_port, &SockAdrClient.sin_port) != 0)
        {
        ShowMessage("WSAHtons(): " + IntToStr(WSAGetLastError()));
        return;
        }
if(WSAHtonl(SocketClient, SockAdrClient.sin_addr.s_addr, &SockAdrClient.sin_addr.s_addr) != 0)
        {
        ShowMessage("WSAHtonl(): " + IntToStr(WSAGetLastError()));
        return;
        }

if(bind(SocketClient, (SOCKADDR *) &SockAdrClient, sizeof(SockAdrClient)) != 0)
        {
        ShowMessage("bind(): " + IntToStr(WSAGetLastError()));
        return;
        }
WSABUF RecvBuf;
RecvBuf.buf = new char[256];
RecvBuf.len = 256;
DWORD ByteRecv;
int SizeSockAdrClient = sizeof(SockAdrClient);
DWORD flags = 0;
if(WSARecvFrom(SocketClient, &RecvBuf, 1, &ByteRecv, &flags, (SOCKADDR *) &SockAdrClient, &SizeSockAdrClient, NULL, NULL) != 0)
        {
        if(WSAGetLastError() != WSAEWOULDBLOCK)
                {
                ShowMessage("WSARecvFrom(): " + IntToStr(WSAGetLastError()));

                }
        else
                {
                while(WSARecvFrom(SocketClient, &RecvBuf, 1, &ByteRecv, &flags, (SOCKADDR *) &SockAdrClient, &SizeSockAdrClient, NULL, NULL) != 0)
                        {
                        Sleep(100);
                        }
                }
        }
Form1->Edit1->Text = AnsiString(RecvBuf.buf);// имя файла(запрос клиента)
delete[] RecvBuf.buf;
closesocket(SocketClient);

//Посылаем данные:
SocketClient = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
if(SocketClient == INVALID_SOCKET)
        {
        ShowMessage("WSASocket(): " + IntToStr(WSAGetLastError()));
        }

WSABUF SendBuf;
SendBuf.buf = new char[256];
AnsiString SendMessage;
AnsiString FS;
if(!FileExists(Form1->Edit1->Text)) //если файл запрашиваемый клиентом не найден то увы
        {
        SendMessage = "Файл не найден";
        }
else
        {

  if (!DeleteFile(Form1->Edit1->Text.c_str()))    //собственно тут мы удаляем файл по запросу клиента
  MessageBox(NULL,"Ошибка удаления файла!!!","Сообщение",MB_OK);
  else  SendMessage =  "Файл удален";

Form1->Edit2->Text = SendMessage;  // информация,(файл удален,либо файл не найден)
strcpy(SendBuf.buf, SendMessage.c_str());
SendBuf.len = 256;
DWORD ByteSend;
SockAdrClient.sin_port = PORT;
if(WSAHtons(SocketClient, SockAdrClient.sin_port, &SockAdrClient.sin_port) != 0)
        {
        ShowMessage("WSAHtons(): " + IntToStr(WSAGetLastError()));
        }
if(WSASendTo(SocketClient, &SendBuf, 1, &ByteSend, 0, (SOCKADDR *) &SockAdrClient, sizeof(SockAdrClient), NULL, NULL) != 0)
        {
        ShowMessage("WSASendTo(): " + IntToStr(WSAGetLastError()));
        }
delete[] SendBuf.buf;
closesocket(SocketClient);
_beginthread(WaitMessage, 0, NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
WSAData wsd;
if(WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
        {
        ShowMessage("Не удалость загрузить WinSock.dll");
        return;
        }
_beginthread(WaitMessage, 0, NULL);
}
http://rghost.ru/56141510- ссылка на программу

Последний раз редактировалось Максикок; 03.06.2014 в 18:40.
Максикок вне форума Ответить с цитированием
Старый 03.06.2014, 19:35   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Необходимо именно классическими сокетами? INDI не катит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2014, 19:40   #4
Максикок
Пользователь
 
Регистрация: 07.10.2010
Сообщений: 71
По умолчанию

только так к сожалению,примерно понимаю как сделать,создавать на компьютере клиенте файл с таким же именем как запрашиваемый(если он есть) и с сервера посимвольно передавать,но вот с реализацией проблемы,не знаю как сделать
Максикок вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа управления. Клиент сервер SkiHunter Помощь студентам 4 26.07.2013 13:30
Программа клиент-сервер (С++\С#) (oracle) utilizator13 Фриланс 2 14.09.2012 22:51
Программа клиент-сервер mraskc C++ Builder 0 14.02.2012 19:37
Программа клиент сервер Elephent Работа с сетью в Delphi 3 07.02.2011 18:08
Помогите.Программа клиент-сервер vyt Работа с сетью в Delphi 3 14.03.2007 16:01