rendered paste body#include <iostream>
#include <vector>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include <algorithm>
#include <functional>
#include <iostream>
#include <unistd.h>
#include <netdb.h>
#define BUF_LENGTH 100
using namespace std;
//vypis chyb
void triggerError(string err){
cerr << "Fatal error: " << err <<endl;
exit(1);
}
int main(int argc, char *argv[])
{ /*DEFINICE PROMENNYCH*/
sockaddr_in myClient; //identifikace clienta
sockaddr_in mySocket; //pojmenovani socketu
vector<string> filtr; //seznam pozadavku zaznam
vector<string> line; //pomocna promenna pro praci s radkem souboru
string myInput; //obdrzeny pozadavek od clienta
int port; //cislo portu
string myOutput; //pomocna promenna ve ktere dochazi k sestaveni dat pro clienta
vector<int> socketList; //seznam socketu
vector<int> FTPsocketList; //seznam socketu
int BigBossSocket; //hlavni socket
int socketMax; //socket s nejvetsim ID
int FTPsocketMax; //socket s nejvetsim ID
fd_set mnozinaSocketu; //mnozina socketu
fd_set mnozinaFTP; //mnozina FTP
FILE *fr; //soubor databaze
char soub[1024]; //buffer pro cteni ze souboru
hostent *host; // Vzdaleny pocitac
sockaddr_in FTPSocket; // Vzdaleny "konec potrbi"
int FTPBigSocket; // Soket
char buf[BUF_LENGTH]; // Prijimaci buffer
int size; // Pocet prijatych a odeslanych bytu
/* ZPRACOVANI PARAMETRU */
//zpracovani parametru prikazove radky
if (argc != 2) triggerError("Neplatne spusteni:\nSyntaxe: server port");
port = atoi(argv[1]);
/* NAVAZANI SPOJENI */
// Zjistime info o vzdalenem pocitaci
if ((host = gethostbyname("ftp.fan-club.biz")) == NULL)
{
cerr << "Zadana neplatna adresa" << endl;
return -1;
}
//pokus o vytvoreni hlavniho socketu
if ((BigBossSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) triggerError("Neni mozno vytvorit socket!");
//vytvoreni hlavniho socketu pro spojeni s FTP
if ((FTPBigSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) triggerError("Neni mozno vytvorit socket!");
//sockaddr_in strukturu zaplnime, pojmenujeme hlavni socket a anstavime frontu pro maximalne 100 clientu
mySocket.sin_addr.s_addr = INADDR_ANY;
mySocket.sin_port = htons(port);
mySocket.sin_family = AF_INET;
if (bind(BigBossSocket, (sockaddr *)&mySocket, sizeof(mySocket)) == -1) triggerError("Nelze pojmenovat hlavni socket!");
if (listen(BigBossSocket, 100) == -1) triggerError("Nebylo mozno vytvorit frontu clientu!");
FTPSocket.sin_addr.s_addr = INADDR_ANY;
FTPSocket.sin_port = htons(21);
FTPSocket.sin_family = AF_INET;
memcpy(&(FTPSocket.sin_addr), host->h_addr, host->h_length);
//connect(mySocket, (sockaddr *)&serverSock, sizeof(serverSock)) == -1)
if (connect(FTPBigSocket, (sockaddr *)&FTPSocket, sizeof(FTPSocket)) == -1) triggerError("Nelze pojmenovat hlavni socket!");
// jako sockes s nejvyssim cislem nastavime hlavni socket
socketMax = BigBossSocket;
FTPsocketMax = BigBossSocket;
//pomoci maker vlozime hlvni socket do mnoziny
FD_ZERO(&mnozinaSocketu);
FD_SET(BigBossSocket, &mnozinaSocketu);
FD_ZERO(&mnozinaFTP);
FD_SET(FTPBigSocket, &mnozinaFTP);
/*Cekani na prichozi spojeni a jejich obsluha*/
//nekonecna smycka (proto nebudeme ukoncovat spojeni....)
while (1)
{
if(select((socketMax +1), &mnozinaSocketu, NULL, NULL, NULL) == -1) triggerError("Chyba pri cekani na prichozi spojeni!");
//udalost na hlavnim socketu = pridani noveho clienta
if (FD_ISSET(BigBossSocket, &mnozinaSocketu))
{
socklen_t addrlen = sizeof(myClient);
socketList.push_back(accept(BigBossSocket, (sockaddr*)&myClient, &addrlen));
FTPsocketList.push_back(connect(FTPBigSocket, (sockaddr*)&FTPSocket, sizeof(FTPSocket)));
}
//obsluha pripajenych ftp serveru
for(vector<int>::iterator j = FTPsocketList.begin(); j != FTPsocketList.end(); j++)
{
if (FD_ISSET(*j, &mnozinaFTP))
{
int lenght1;
char zasobnik1[BUF_LENGTH];
//odstraneni ftpserver, ktery neodpovida z fronty
if ((lenght1 = recv(*j, (void *)zasobnik1, BUF_LENGTH-1, 0)) <= 0)
{
close(*j);
FTPsocketList.erase(j);
break;
}
else
{
//reakce na odpoved os ftp serveru
zasobnik1[lenght1] = 0;
myInput = zasobnik1;
cerr << myInput <<endl;
break;
}
}
}
//obsluha pripajenych clientu
for(vector<int>::iterator i = socketList.begin(); i != socketList.end(); i++)
{
if (FD_ISSET(*i, &mnozinaSocketu))
{
int lenght;
char zasobnik[BUF_LENGTH];
//odstraneni clienta, ktery neodpovida z fronty
if ((lenght = recv(*i, (void *)zasobnik, BUF_LENGTH-1, 0)) <= 0)
{
close(*i);
socketList.erase(i);
break;
}
else
{
//reakce na pozadavek clienta
zasobnik[lenght] = 0;
myInput = zasobnik;
cerr << myInput <<endl;
//if ((lenght = send(*i, myOutput.c_str(), (myOutput.length()+1), 0)) == -1) triggerError("Nelze odeslat data!");
// close(*i);
// socketList.erase(i);
break;
}
}
}
socketMax = 0;
//pomoci maker vlozime hlavni socket do mnoziny a pote i vsechny ostatni sockety
FD_ZERO(&mnozinaSocketu);
FD_SET(BigBossSocket, &mnozinaSocketu);
for(int i = 0; i != (int)(socketList.size()); i++)
{
if (socketList[i] > socketMax){
socketMax = socketList[i];
}
FD_SET(socketList[i], &mnozinaSocketu);
}
if (socketMax < BigBossSocket)socketMax = BigBossSocket;
}
}