#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BUF_LENGTH 100 using namespace std; //vypis chyb void triggerError(string err){ cerr << "Fatal error: " << err < filtr; //seznam pozadavku zaznam vector 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 socketList; //seznam socketu vector 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::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 <::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 < socketMax){ socketMax = socketList[i]; } FD_SET(socketList[i], &mnozinaSocketu); } if (socketMax < BigBossSocket)socketMax = BigBossSocket; } }