См. документацию.00001
00002
00003
00004
00005
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
00065 serv.startParsing();
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
00080
00081
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
00108 }