//Envía un paquete tipo datagrama desde este socket int SocketDatagrama::envia(PaqueteDatagrama & p) { direccionForanea.sin_family = AF_INET; direccionForanea.sin_addr.s_addr = inet_addr(p.obtieneDireccion()); direccionForanea.sin_port = htons(p.obtienePuerto()); sendto(s, (char *)p.obtieneDatos(), p.obtieneLongitud(), 0, (struct sockaddr *) &direccionForanea, sizeof(direccionForanea)); }
int SocketDatagrama::recibe(PaqueteDatagrama & p) { unsigned int addr_len = sizeof(direccionForanea); bzero((char *)&direccionForanea, sizeof(direccionForanea)); int regreso = (int)recvfrom(s,p.obtieneDatos(),p.obtieneLongitud(), 0, (struct sockaddr *) &direccionForanea, &addr_len); p.inicializaPuerto(ntohs(direccionForanea.sin_port)); p.inicializaIp(inet_ntoa(direccionForanea.sin_addr)); //std::cout << "Mensaje recibido de: " << inet_ntoa(direccionForanea.sin_addr) << ":" << ntohs(direccionForanea.sin_port) << std::endl; return regreso; }
// Recibe un paquete tipo datagrama proveniente de este socket int SocketDatagrama::recibe(PaqueteDatagrama &p) { int retorno; socklen_t clilen; // Ojo no compila si es un tipo int en C clilen = sizeof(direccionForanea); retorno = recvfrom(s, (char *)p.obtieneDatos(), p.obtieneLongitud(), 0, (struct sockaddr *)&direccionForanea, &clilen); p.inicializaPuerto(ntohs(direccionForanea.sin_port)); p.inicializaIp(inet_ntoa(direccionForanea.sin_addr)); return retorno; }
int SocketDatagrama::envia(PaqueteDatagrama & p) { int status; //char *datos = p.obtieneDatos(); direccionForanea.sin_family = AF_INET; direccionForanea.sin_addr.s_addr = inet_addr((char *)p.obtieneDireccion()); direccionForanea.sin_port = htons(p.obtienePuerto()); status = sendto(s, p.obtieneDatos(), p.obtieneLongitud(), 0, (struct sockaddr *) &direccionForanea, sizeof(direccionForanea)); //cout << (char*) p.obtieneDatos() << endl; return status; }
int SocketDatagrama::recibe(PaqueteDatagrama &p, int size) { //char *datos = new char[p.obtieneLongitud()]; socklen_t clilen = sizeof(direccionForanea); int status = recvfrom(s, (char *)p.obtieneDatos(), p.obtieneLongitud(),0, (struct sockaddr *)&direccionForanea, &clilen); p.inicializaIp(inet_ntoa(direccionForanea.sin_addr)); p.inicializaPuerto(ntohs(direccionForanea.sin_port)); //cout << "Recibiendo de " << inet_ntoa(direccionForanea.sin_addr) << " en el puerto : " <<ntohs(direccionForanea.sin_port)<<endl; //cout << &res << endl; //printf("%d",res); return status; }
int main() { SocketDatagrama socket = SocketDatagrama(7300); int * numeros; PaqueteDatagrama datagrama = PaqueteDatagrama( 2 * sizeof(int)); socket.recibe(&datagrama); numeros = (int *) datagrama.obtieneDatos(); int * ans = (int *)malloc(sizeof(int)); *ans = numeros[0] + numeros[1]; cout << "Numeros recibidos " << numeros[0] << " y " << numeros[1] << " de " << datagrama.obtieneDireccion() << ":" << datagrama.obtienePuerto() << endl; PaqueteDatagrama databack = PaqueteDatagrama((char*) ans, sizeof(int), datagrama.obtieneDireccion(), datagrama.obtienePuerto()); socket.envia(&databack); return 0; }
// Recibe un paquete tipo datagrama proveniente de este socket int SocketDatagrama::recibeTimeOut(PaqueteDatagrama &p) { int retorno; socklen_t clilen; // Ojo no compila si es un tipo int en C clilen = sizeof(direccionForanea); retorno = recvfrom(s, (char *)p.obtieneDatos(), p.obtieneLongitud(), 0, (struct sockaddr *)&direccionForanea, &clilen); p.inicializaPuerto(ntohs(direccionForanea.sin_port)); p.inicializaIp(inet_ntoa(direccionForanea.sin_addr)); if (retorno < 0) { if (errno == EWOULDBLOCK) fprintf(stderr, "Tiempo para recepción transcurrido\n"); else fprintf(stderr, "Error en recvfrom\n"); } return retorno; }
//---------------------------------------------------- // Recibir, en packRecv, cada mensaje desde clienteSMS //---------------------------------------------------- void recibirVoto(void){ int i=0; cout<<"Iniciando escucha..."<<endl; while(1){ struct Mensaje* voto; char* sentencia; if(socketV.recibe(packRecv) != -1){ voto = (struct Mensaje*) packRecv.obtieneDatos(); //cout << "--------------------------"<<endl; cout << i+1<<"°] Voto recibido" <<endl; /*cout << "--------------------------"<<endl; cout << "Celular: "<< voto->celular <<endl; cout << "CURP: "<< voto->CURP <<endl; cout << "Partido: "<< voto->partido <<endl; cout << "Nombre: "<< voto->nombre <<endl; cout << "--------------------------"<<endl<<endl;*/ i++; nuevoVoto(voto); /* *Parte que guarda en el log la estructura */ char* votoChar; char vo[150] =""; strcat (vo,voto->celular); strcat (vo,"|"); strcat (vo,voto->CURP); strcat (vo,"|"); strcat (vo,voto->partido); strcat (vo,"|"); strcat (vo,voto->nombre); votoChar = vo; write_journal_entry(votoChar); }//else{ cout<<"S_TO"<<endl;} } }