ServerProgram.cpp

См. документацию.
00001 /*
00002  * ServerProgram.cpp
00003  *
00004  *  Created on: 18.04.2011
00005  *      Author: nick
00006  */
00007 
00008 #include "ServerProgram.h"
00009 #include "LibFileOperations/main.h"
00010 
00011 int ServerProgram::waiteSocketConnection(int i32SocketFD) {
00012     int i32ConnectFD = accept(i32SocketFD, 0, 0);
00013     if (i32ConnectFD < 0) {
00014         perror("ошибка принятия");
00015         close(i32ConnectFD); /* нужно ли закрывать сокет после ошибки? */
00016         exit(EXIT_FAILURE);
00017     }
00018     return i32ConnectFD;
00019 }
00020 
00021 int ServerProgram::createSocket(uint16_t port) {
00022     struct sockaddr_in stSockAddr;
00023     int i32SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
00024     if (i32SocketFD == -1) {
00025         cerr << "ошибка при создании сокета" << endl;
00026         exit(EXIT_FAILURE);
00027     }
00028     memset(&stSockAddr, 0, sizeof ( stSockAddr));
00029     stSockAddr.sin_family = PF_INET;
00030     stSockAddr.sin_port = htons(port);
00031     stSockAddr.sin_addr.s_addr = INADDR_ANY;
00032 
00033     if (
00034             bind(i32SocketFD, (const sockaddr*) & stSockAddr, /* зачем приведение типа? */sizeof ( stSockAddr)) == -1
00035             ) {
00036         cerr << "ошибка связывания" << endl;
00037         close(i32SocketFD);
00038         exit(EXIT_FAILURE);
00039     }
00040 
00041     if (listen(i32SocketFD, 10) == -1) {
00042         cerr << "ошибка прослушивания" << endl;
00043         close(i32SocketFD);
00044         exit(EXIT_FAILURE);
00045     }
00046     return i32SocketFD;
00047 }
00048 
00049 void* client_thread_func(void* data ){
00050         clientData* cld= static_cast<clientData*> (data);
00051         ServerProgram* self=cld->self;
00052         unsigned int i32ConnectFD=cld->i32ConnectFD;
00053         unsigned int i32ConnectFDb=cld->i32ConnectFDb;
00054         delete cld;
00056         BinaryProtocolServer bs(self->sc);
00057         Server serv;
00058         unsigned int modid=registerModule(&serv, self->sc, &bs);
00059         serv.setClientId(modid);
00060 //============================================================
00061         cout<<"Клиент подключился"<<endl;
00062         bs.startTread(i32ConnectFDb);
00063         serv.parserCreate(i32ConnectFD);
00064         //serv.skt_id=i32ConnectFD;
00065         serv.startParsing(/*i32ConnectFD*/);
00066         cout<<"Клиент отключился"<<endl;
00067     //
00068         shutdown(i32ConnectFD, SHUT_RDWR);
00069         close(i32ConnectFD);
00070 
00071         shutdown(i32ConnectFDb, SHUT_RDWR);
00072         close(i32ConnectFDb);
00073         unregisterModule(modid);
00075         return NULL;
00076 }
00077 
00078 ServerProgram::ServerProgram() {
00079     // TODO Auto-generated constructor stub
00080     //ServerConfig* sc=ServerConfig::getInstance();
00081     //ServerConfig sc;
00082     pthread_t clntthrd;
00083     pthread_attr_t clntthrd_attr;
00084     pthread_attr_init(&clntthrd_attr);
00085     pthread_attr_setdetachstate(&clntthrd_attr,PTHREAD_CREATE_DETACHED);
00086     sc=new ServerConfig();
00087     //====
00088     int i32SocketFD = createSocket(sc->getServerPort());
00089     int i32SocketFDb = createSocket(sc->getServerBinPort());
00090     while(true){
00092     
00093         int i32ConnectFD = waiteSocketConnection(i32SocketFD);
00094         int i32ConnectFDb = waiteSocketConnection(i32SocketFDb);
00095         clientData* cld=new clientData;
00096         cld->i32ConnectFD=i32ConnectFD;
00097         cld->i32ConnectFDb=i32ConnectFDb;
00098         cld->self=this;
00099         
00100         pthread_create(&clntthrd, &clntthrd_attr, client_thread_func, cld);
00101     }
00102     pthread_attr_destroy(&clntthrd_attr);
00103     delete sc;
00104 }
00105 
00106 ServerProgram::~ServerProgram() {
00107     // TODO Auto-generated destructor stub
00108 }