DWORD WINAPI Server::ClientThread(LPVOID lpParam) //(insert to DEQUE) use MUTEX { Singleton* log = Singleton::Instance(); log->Add("Thread: Client runing"); SOCKET sock = (SOCKET)lpParam; //Get socket while(f) { //recv DATA, create STRUCTURE and (insert to DEQUE)MUTEX //Send will be in APPLY THREAD if ( recv(sock,rdata.ch,sizeof(DWORD),0) != -1 ) //Wait data //save data to union { Message tmp; tmp.s = sock; tmp.data = rdata.i; WaitForSingleObject(hMutex,INFINITE); deque_data.push_back(tmp); ReleaseMutex(hMutex); } else { break; } } log->Add("Thread: Client stoped"); return 0; }
bool Server::Activate(int userCount = 5, int port = 7500) { Singleton* log = Singleton::Instance(); if ( port <= 0 || port >= 65535 || userCount <= 0 ) { log->Add("Server: Bad activation data"); return false; } if ( WSAStartup(MAKEWORD(2,2),&wsadata) != 0) { log->Add("Server: Err WSADATA"); return false; } log->Add("Server: WSA activate"); if ( (serv = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET ) { log->Add("Server: INVALID SOCKET"); return false; } log->Add("Server: Socket activate"); local.sin_family= AF_INET; local.sin_port = htons(port); local.sin_addr.s_addr = htonl(INADDR_ANY); // ALL IP if ( bind(serv,(struct sockaddr*)&local,sizeof(local)) != 0 ) //0 - done { log->Add("Server: Bind err"); return false; } log->Add("Server: Bind done"); if ( listen(serv,userCount) != 0 ) { log->Add("Server: listen err"); return false; } log->Add("Server: listen done"); log->Add("Server: activate done"); hMutex = CreateMutex(NULL,false,NULL);//Create mutex for all threads HANDLE hT = CreateThread(NULL,NULL,Server::Accept,NULL,NULL,NULL); //CreateThread for accept HANDLE hT2 = CreateThread(NULL,NULL,Server::Apply,NULL,NULL,NULL); //Create APPLY thread CloseHandle(hT); CloseHandle(hT2); return true; }
DWORD WINAPI Server::Accept(LPVOID) { Singleton* log = Singleton::Instance(); log->Add("Thread: Accept runing"); while (f) { int size = sizeof(client); s = accept(serv,(struct sockaddr*)&client,&size); //create thread vs new SOCKET HANDLE hThread = CreateThread(NULL,NULL,ClientThread,(LPVOID)s,NULL,NULL); CloseHandle(hThread); } log->Add("Thread: Accept stoped"); return 0; }
DWORD WINAPI Server::Apply(LPVOID) // (Get structure from DEQUE)use MUTEX { Singleton* log = Singleton::Instance(); log->Add("Thread: Apply running"); while(f) { //(Get structure from deque)MUTEX ....calculation with data and send data WaitForSingleObject(hMutex,INFINITE); if ( !deque_data.empty() ) { sdata.i = deque_data.front().data * 2; //Information to UNION SOCKET s = deque_data.front().s; //Get Socket deque_data.pop_front(); send(s,sdata.ch,sizeof(DWORD),0); } ReleaseMutex(hMutex); Sleep(1); //CPU 100% } log->Add("Thread: Applay stoped"); return 0; }