All pastes #778189 Raw Edit

Something

public text v1 · immutable
·published 2007-11-17 11:52 UTC
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;





  }
}