Консультация № 179419
06.07.2010, 15:05
43.38 руб.
0 4 1
Здравствуйте, уважаемые эксперты!
Мне надо написать FTP сервер. Подскажите пожалуйста, с чего начать?
А конкретно:
- Какой минимальный функционал необходим для такой программы?
- В целом какие функции может выполнять такая программа (можно примеры уже готовых продуктов?
- Насколько сложно это в реализации?
- Какой лучше выбрать язык программирования: С++ (на Builder) или C#?

Заранее, спасибо.

Обсуждение

Неизвестный
06.07.2010, 16:00
общий
Рабочие клиент и сервер.

клиент

#include <cstdlib>
#include <iostream>
#include <winsock2.h>

using namespace std;

int main(int argc, char *argv[])
{
WSADATA WsaData;
int err = WSAStartup (0x0101, &WsaData);
if (err == SOCKET_ERROR)
{
printf ("WSAStartup() failed: %ld\n", GetLastError ());
return 1;
}
SOCKET socket1=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //создаём сокет и заполняем структуру
SOCKADDR_IN anAddr;
anAddr.sin_family = AF_INET;
anAddr.sin_port = htons(2042); //порт через который будем передавать сообщения серверу
anAddr.sin_addr.S_un.S_addr = inet_addr("94.100.178.28"); //айпи адресс указывайте 127.0.0.1
connect(socket1, (struct sockaddr *)&anAddr, sizeof(struct sockaddr));
char* buf=new char[5];
cin>>buf;
send (socket1,(const char*)buf,sizeof(buf),MSG_DONTROUTE);
system("PAUSE");
return EXIT_SUCCESS;
}


сервер

#include <cstdlib>
#include <iostream>
#include <winsock2.h>

using namespace std;

int main(int argc, char *argv[])
{
WSADATA WsaData;
int err1 = WSAStartup (0x0101, &WsaData);
if (err1 == SOCKET_ERROR)
{
printf ("WSAStartup() failed: %ld\n", GetLastError ());
return 1;
}

SOCKADDR_IN sin,from;int err;SOCKET s1;char MsgText[100]="Hello Client1";
SOCKET socket1=socket(AF_INET,SOCK_STREAM,0);
if(socket1 == -1) cout<<"Nesuveike funkcija socket()"<<"\n";
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
sin.sin_addr.s_addr = INADDR_ANY;
err = bind(socket1,(LPSOCKADDR)&sin,sizeof(sin) );
if(err == -1) cout<<"Nesuveike funkcija bind()"<<"\n";
err = listen(socket1,SOMAXCONN);
if(err != 0) cout<<"Nesuveike funcija listen()"<<"\n";
int d=sizeof(from);
s1=accept(socket1,(sockaddr*)s1,&d);
printf("accepted connection from %s, port %d\n",inet_ntoa(from.sin_addr),htons(from.sin_port));
BYTE RecvBuffer[1];
while(recv(s1,(char*)RecvBuffer,sizeof(RecvBuffer),0)!=SOCKET_ERROR)
{
printf("%c",RecvBuffer[0]);
send(s1,MsgText,sizeof(MsgText),MSG_DONTROUTE);
}
closesocket(s1);
system("PAUSE");
return EXIT_SUCCESS;
}

Неизвестный
06.07.2010, 16:08
общий
06.07.2010, 18:25
это ответ
Здравствуйте, Draconit.

Рабочие клиент и сервер.

Скомпилировано wxdev c++. Может и в code::blocks скомпилируется без изменений каких-нибудь. Не знаю не пробовал.
Забыл подчеркнуть, это не ftp сервер, это только сервер, а передачу файлов и хранение их вы организуете сам. Не знаю, что тут добавить. Ну ftp используется 25 порт.

Приложение:
клиент

#include <cstdlib>
#include <iostream>
#include <winsock2.h>

using namespace std;

int main(int argc, char *argv[])
{
WSADATA WsaData;
int err = WSAStartup (0x0101, &WsaData);
if (err == SOCKET_ERROR)
{
printf ("WSAStartup() failed: %ld\n", GetLastError ());
return 1;
}
SOCKET socket1=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //создаём сокет и заполняем структуру
SOCKADDR_IN anAddr;
anAddr.sin_family = AF_INET;
anAddr.sin_port = htons(2042); //порт через который будем передавать сообщения серверу
anAddr.sin_addr.S_un.S_addr = inet_addr("94.100.178.28"); //айпи адресс указывайте 127.0.0.1
connect(socket1, (struct sockaddr *)&anAddr, sizeof(struct sockaddr));
char* buf=new char[5];
cin>>buf;
send (socket1,(const char*)buf,sizeof(buf),MSG_DONTROUTE);
system("PAUSE");
return EXIT_SUCCESS;
}


сервер

#include <cstdlib>
#include <iostream>
#include <winsock2.h>

using namespace std;

int main(int argc, char *argv[])
{
WSADATA WsaData;
int err1 = WSAStartup (0x0101, &WsaData);
if (err1 == SOCKET_ERROR)
{
printf ("WSAStartup() failed: %ld\n", GetLastError ());
return 1;
}

SOCKADDR_IN sin,from;int err;SOCKET s1;char MsgText[100]="Hello Client1";
SOCKET socket1=socket(AF_INET,SOCK_STREAM,0);
if(socket1 == -1) cout<<"Nesuveike funkcija socket()"<<"\n";
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
sin.sin_addr.s_addr = INADDR_ANY;
err = bind(socket1,(LPSOCKADDR)&sin,sizeof(sin) );
if(err == -1) cout<<"Nesuveike funkcija bind()"<<"\n";
err = listen(socket1,SOMAXCONN);
if(err != 0) cout<<"Nesuveike funcija listen()"<<"\n";
int d=sizeof(from);
s1=accept(socket1,(sockaddr*)s1,&d);
printf("accepted connection from %s, port %d\n",inet_ntoa(from.sin_addr),htons(from.sin_port));
BYTE RecvBuffer[1];
while(recv(s1,(char*)RecvBuffer,sizeof(RecvBuffer),0)!=SOCKET_ERROR)
{
printf("%c",RecvBuffer[0]);
send(s1,MsgText,sizeof(MsgText),MSG_DONTROUTE);
}
closesocket(s1);
system("PAUSE");
return EXIT_SUCCESS;
}

Неизвестный
06.07.2010, 16:09
общий
Valera_ja:
Спасибо большое. Но все же хотелось бы узнать про функционал программы. Ибо если получиться реализовать это как курсовую.
Неизвестный
06.07.2010, 18:57
общий
Функционал скорее всего пользователи,групы,авторизация,может быть шареный ресурс или наоборот.Я более широко вам не скажу.Я неписал фтп (честно признаюсь).Вот в эту сторону копать надо.
Форма ответа