void * conexionCliente(void *socket_desc){ socketStruct sock = *(socketStruct*) socket_desc; char **mensaje; char *ptr; char ** contestacion; int read_size,valor; char limitador[] = "\r\n"; mensaje = (char**) calloc(100,sizeof(char*)); contestacion = (char**)calloc(100,sizeof(char*)); mensaje[sock.socketId] = (char*) calloc(512,sizeof(char)); contestacion[sock.socketId] = (char*) calloc(512,sizeof(char)); usersHash_beginWrite(); usersHash_put(sock.socketId, "temp"); usersHash_endWrite(); sprintf(contestacion[sock.socketId],":%s 020 * :Please wait wile we process your connection to %s\r\n",servidor,servidor); if(eviarDatos((const void **) contestacion, strlen(contestacion[sock.socketId]), sock.socketId) == ERROR){ syslog(LOG_ERR,"Error al enviar mensaje\n"); return NULL; } if(read_size = recibeDatos(sock.socketId,(void **) mensaje)<0){ syslog(LOG_ERR,"Error al recibir el mensaje\n"); return NULL; } ptr = strtok(mensaje[sock.socketId], limitador); ptr = strtok(NULL, limitador); syslog(LOG_INFO,"%s %s\n",mensaje[sock.socketId],ptr); procesarMensaje(mensaje[sock.socketId],contestacion,sock.socketId); procesarMensaje(ptr,contestacion,sock.socketId); strcpy(mensaje[sock.socketId], ""); syslog(LOG_INFO,"%s\n",mensaje[sock.socketId]); while( (read_size = recibeDatos(sock.socketId,(void **) mensaje)) > 0 ){ syslog(LOG_INFO,"%s \n",mensaje[sock.socketId]); ptr = strtok(mensaje[sock.socketId], limitador); procesarMensaje(mensaje[sock.socketId],contestacion,sock.socketId); valor = strlen(contestacion[sock.socketId]); if(eviarDatos((const void **) contestacion, valor, sock.socketId) == ERROR){ syslog(LOG_ERR,"Error al enviar mensaje\n"); return NULL; } } return OK; }
bool server::leerBloqueando(int id) { //Reseteo el buffer que se va a completar con nuevos mensajes bzero(buffer,256); char *p = (char*)buffer; int messageLength = 0; int n = recv(m_listaDeClientes.getElemAt(id), p, MESSAGE_LENGTH_BYTES, 0); if (!lecturaExitosa(n, id)) return false; int acum = n; while (n < 4) { p += n; n = recv(m_listaDeClientes.getElemAt(id), p, MESSAGE_LENGTH_BYTES, 0); if (!lecturaExitosa(n, id)) return false; acum += n; } messageLength = m_alanTuring->decodeLength(buffer); p += n; messageLength -= acum; //loopea hasta haber leido la totalidad de los bytes necarios while (messageLength > 0) { n = recv(m_listaDeClientes.getElemAt(id), p, messageLength, 0); if (!lecturaExitosa(n, id)) return false; p += n; messageLength -= n; } //resetea el timer de timeout m_listaTimeOuts.getElemAt(id).Reset(); NetworkMessage netMsgRecibido = m_alanTuring->decode(buffer); ServerMessage serverMsg; serverMsg.clientID = id; serverMsg.networkMessage = netMsgRecibido; /*string my_str2 (buffer); mensije msg; msg.id = id; msg.texto = my_str2;*/ procesarMensaje(&serverMsg); return true; }
void ManejadorDeColaDeMensajes::run() { mensaje m; int resultado; while(sigint_handler.getGracefulQuit() == 0) { string s = ""; resultado = colaDeMensajes.leer(tipoALeer, &m); if (resultado == -1) continue; while (m.status == STATUS_INCOMPLETO) { s.append(m.texto); resultado = colaDeMensajes.leer(tipoALeer, &m); if (resultado == -1) continue; } s.append(m.texto); procesarMensaje(m, s); } }
void* server::procesar(void) { while(this->isRunning()) { //Chekea timeouts checkTimeOuts(); //Procesa cola if (m_mensajesAProcesar.size() != 0) { ServerMessage serverMsg = m_mensajesAProcesar.remove(); // BLOQUE DE PROCESAMIENTO procesarMensaje(&serverMsg); // BLOQUE DE PROCESAMIENTO //m_queuePost[serverMsg.clientID].add(serverMsg); } } }