DWORD WINAPI readPipeAndSendToSocketThreadLoop(LPVOID lpParam) { SOCKET* ClientSocket = (SOCKET*)lpParam; char recvbuf[DEFAULT_BUFLEN]; int recvbuflen = DEFAULT_BUFLEN; int bufSize = 0; int iSendResult; for (;;) { ZeroMemory(&recvbuf, recvbuflen); bufSize = readFromPipe(recvbuf); iSendResult = send(*ClientSocket, recvbuf, bufSize, 0); if (iSendResult == SOCKET_ERROR) { printf("send failed with error: %d\n", WSAGetLastError()); if (isForceQuit) { return 0; } else { closeClientSocket(); WSACleanup(); return 1; } } } return 0; }
int closeServer() { int iResult = 0; isForceQuit = true; if (!isConnectionEstablished) { iResult = closesocket(ListenSocket); ListenSocket = INVALID_SOCKET; WSACleanup(); return iResult; } else { closePipes(); closeClientSocket(); WSACleanup(); return 0; } return -1; }
void *Server::recvDataSocket(void *client_sock) { cout << "Thread listener created" << endl; int active = j; cout << "recv on :" << active << endl; int c_sock = *((int*)client_sock); int cl_sock = *((int*)c_sock); char* buff; buff = new char[MAXBUF]; bzero(buff,MAXBUF); int len; char *str; cout << "Client Socket: " << users[active].getID() << endl; cout << "status client "<< users[active].getID() << ": "<< users[active].getStatus() << endl; /* Main loop */ while(users[active].getStatus()=="online"){ cout << "lock listener called" << endl; users[active].setMessage(""); bzero(buff,MAXBUF); len = recv(users[active].getID(), buff , MAXBUF , 0); //receive message from user printf("%s\n",buff); buff = strtok(buff,"\n\r"); users[active].setMessage((string)buff); if (len>=0){ string dest = getDestination(users[active].getMessage()); int id_dest = searchIDbyName(dest); if(users[active].getMessage()=="logout"){ //if user type "logout" cout << "masuk" << endl; closeClientSocket(users[active].getID()); users[active].setStatus("offline"); cout << "client "<< users[active].getID() << ": "<< users[active].getStatus() << endl; break; } else if(dest=="--login--"){ int success = 0; listUser(); string usr=getUsernameFromMessage(users[active].getMessage()); string pass=getPasswordFromMessage(users[active].getMessage()); cout << "usr: "******"usr length: " << usr.length() << endl; cout << "pass: "******"pass length: " << pass.length() << endl; success = login(usr,pass); cout << "success: " << success << endl; if (success>0){ // char * convert; convert = new char[32]; string msg = "Welcome to the MESSENGER"; write(users[active].getID(),msg.c_str(),strlen(msg.c_str())); users[active].setName(usr); }else{ users[active].setStatus("offline"); logger.loggedIn(usr); closeClientSocket(users[active].getID()); } } else if (dest=="--register--"){ string usr=getUsernameFromMessage(users[active].getMessage()); string pass=getPasswordFromMessage(users[active].getMessage()); int success = 0; success = signup(usr,pass); cout <<"success: " << success << endl; if (success>0){ string msg = "account succesfully created"; write(users[active].getID(),msg.c_str(),strlen(msg.c_str())); users[active].setName(usr); logger.terdaftar(usr); } }else if(dest=="--create--"){ string grpname = getMessage(users[active].getMessage()); cout << grpname << endl; cout << grpname.length() << endl; //Server::group.newGroup(grpname); group.newGroup(strdup(grpname.c_str())); write(users[active].getID(),"Group succesfully created",25); } else if(dest=="--join--"){ string group=getUsernameFromMessage(users[active].getMessage()); string name=getPasswordFromMessage(users[active].getMessage()); cout << group; cout << name; /* char* membername; strcpy(membername, name.c_str()); cout << groupname; cout << membername; */ Server::group.addNewMemberGroup(group,name); }else if(dest=="--leave--"){ string group=getUsernameFromMessage(users[active].getMessage()); string name=getPasswordFromMessage(users[active].getMessage()); char* groupname; strcpy(groupname, group.c_str()); char* membername; strcpy(membername, name.c_str()); Server::group.delMember(groupname,membername); logger.left(membername, groupname); } else if(dest=="--group--"){ string group=getUsernameFromMessage(users[active].getMessage()); string message=getPasswordFromMessage(users[active].getMessage()); char* groupname; strcpy(groupname, group.c_str()); cout << "group message: " << message << endl; sendToAll(groupname,message); }else{ cout << "dest: " << dest << endl; cout << "len dest: " << dest.length() << endl; cout << "id_dest" << id_dest << endl; cout << "Message: " << getMessage(users[active].getMessage()) << endl; cout << "Message len: " << getMessage(users[active].getMessage()).length() << endl; cout << "test : " << active << endl; // users[active].setLength(len); if(id_dest!=-1){ string concatmsg = users[active].getName() + " : " + getMessage(users[active].getMessage()); users[id_dest].setMessage(concatmsg); cout << "test lawan: " << users[id_dest].getMessage()<< endl; cout << "status: " << users[active].getStatus() << endl; users[id_dest].setLength(len); } } } cout << "bufer[" << active << "] : " << users[active].getMessage().length() << endl; // cout << "unlock listener called" << endl; } cout << "Thread-listener for sock: " << active << " die..........." << endl; pthread_exit(NULL); }