/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problemas con select

 
      Índice del Foro elrincondelc.com -> Programación en Servidores
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
AmorpH



Registrado: 19 Jul 2005
Mensajes: 7

MensajePublicado: 29/08/2005 3:58 am
Título: Problemas con select

Buenas, he escrito un servidor que debería ir escuchando conexiones entrantes mientras no se pulse una tecla, está y necesito que se use en windows y uso la funcion select(); primero pensé que no estubiera la función para windows pero sí, y ahora no entiendo porque me falla, aún no tengo el cliente terminado pero debería funcionar al pulsar una tecla o almenos enter , pero no lo hace.

postearé el servidor abajo. funciona así:

-Crea el socket, lo formatea...
-escucha a el socket y a la entrada estandar (stdin) (Lo he probado con stdin(inicializada en stdio.h) y con #define STDIN 0 y tampoco)
- en caso que esté listo el socket, recibe un paquete que contiene el tamaño del paquete y luego recive el paquete entero (comprobando los tamaños), llama a un programa externo que modificará el archivo de texto y lo volverá a guardar con otro nombre, mi programa lo lee y devuelve los datos al cliente.
-en caso que se lea algo del teclado se puede finalizar el servidor.


El problema principal está en select() pero si alguien vé alguna cosa que podría mejorarse agradeceré que me lo diga.


Código:


/**************************************************\
*    Autor: AmorpH
*   Descripcion: SERVIDOR (STREAM)
*   Proposito: envio de datos entre ordenadores en red
*                 (internet) para hacer consulta @ CAG
*   Fecha:27-08-05
\**************************************************/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <unistd.h>
#include <winsock.h>
#define PORT 6789
#define BACKLOG 10
#define STDIN 0
void guarda_data(char *);
void lee_data(char *);
void envia_todo(int remfd ,char *buf, int *len);
int main(int argc, char *argv[]){
   /*iniciamos WINSOCK!*/
   WSADATA wsaData;
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {

        printf("WSAStartup fallo");
        exit(1);
    }
   /*select()*/
   fd_set readfd;
    fd_set master;
    FD_ZERO(&readfd);
    FD_ZERO(&master);
    FD_SET(STDIN, &master);
    int fdmax;
    /*select()-fin*/
    char ack[80];
    int ackn;
    int nbytes;
   short i = 0;
   char t;
   char *buffer;
   buffer = (char *)malloc(250000);
   int sockfd, remfd;
   struct sockaddr_in localaddr;
   struct sockaddr_in remoteaddr;

   /*creamos el socket*/
    if( (sockfd = socket( AF_INET , SOCK_STREAM , 0)) == -1){
        perror("socket");
        exit(1);
    }
  /*Le damos formato*/
    localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(PORT);
    localaddr.sin_addr.s_addr = INADDR_ANY;
    memset( localaddr.sin_zero , '\0' , 8);
    if((bind( sockfd , (struct sockaddr *)&localaddr ,sizeof(struct sockaddr) )) == -1){
           perror("bind");
           exit(1);
   }
    /*formateado, vamos a escuchar en el puerto*/
    if((listen(sockfd,BACKLOG))== -1){
            perror("listen");
          exit(1);
          }
    printf("El servidor est\xA0 listo, esperando una conexi\xA2n\n\n");
    /*aceptemos las conexiones y creamos un bucle  para que no deje de buscar*/
    /*mas select()*/
    FD_SET(sockfd,&master);
    fdmax = sockfd;
    while(i == 0){
         readfd = master;
         if((select((fdmax+1), &readfd, NULL, NULL, NULL)) == -1){
                      perror("select");
                      exit(1);
         }
         
         if((FD_ISSET(sockfd, &master))){
                        
                         if((remfd = accept(sockfd, (struct sockaddr*)&remoteaddr, 0))==-1){
                                  perror("accept");
                                  break;
                                 }
                             /*Preparamos comprobacion*/
                             if((nbytes = recv(remfd, ack, sizeof(ack), 0))<= 0){
                                  if(nbytes == 0){
                                         printf("\nConnection closed");
                                         continue;
                                         }
                                else{
                                      perror("recv");
                                      continue;
                                    }
                              }
                           /*Sabemos el tamaño del archivo recibido*/
                              ackn = atoi(ack);
                              nbytes = 0;
                              do{
                                  if((nbytes = nbytes + (nbytes = recv(remfd, buffer+nbytes, (sizeof(buffer) - nbytes) , 0)))<= 0){
                                  if(nbytes == 0){
                                         printf("\nConnection closed");
                                         continue;
                                         }
                                else{
                                      perror("recv");
                                      break;
                                    }
                              }
                              }while(nbytes < ackn);
                        *(buffer+ackn) = '\0';
                            /*Tenemos todos los datos guardadoes en el buffer*/
                            /*Los guardamos a:  "\correu\NAnalitica.txt"*/
                          guarda_data(buffer);
                          /*Llama a programa2*/
                          system("c:\\Lab\\LabServ.exe");
                          lee_data(buffer);
                          nbytes = sizeof(buffer);
                          envia_todo(remfd, buffer, &nbytes);
                          closesocket(remfd);
                         }
       /*Comprobamos si se pulsa INTRO (depende de qué ordenador cualquier tecla)*/
          else if((FD_ISSET(STDIN, &master))){
                           printf("Con esto finalizará el servidor, está seguro? (S/N)");
                           fflush(stdin);
                           t = getchar();
                           t = toupper(t);
                           if( t == 'S' ){
                                           printf("Finalizando....");
                                i--;
                              }
                           else{
                                 ;
                              }
                           }
            else{
               ;
               }
   }
  system("PAUSE");
  closesocket(sockfd);   
  return 0;
}

void guarda_data(char *buffer){
    FILE *fitch;
    if((fitch = fopen("/correu/NAnalitica.txt", "w")) == NULL){
             perror("fopen");
             printf("Impossible guardar los datos, el programa finalizará");
             exit(1);
            }
     fprintf(fitch, "%[^\0]", buffer);
     fprintf(fitch, "\0");
     fclose(fitch);
     return;
    }
   
void lee_data( char *buffer){
    FILE *fitch;
    if((fitch = fopen("/correu/NAnalitica.txt", "r"))== NULL){
             perror("fopen");
             printf("Impossible leer los datos, el programa finalizará");
             exit(1);
            }
     int i = 0;
     do{
        *(buffer+i) = fgetc(fitch);
        i++;
       }while( feof(fitch) == 0 );
     *(buffer + i) = '\0';
     fclose(fitch);
     return;
}

void envia_todo(int remfd ,char *buf, int *len){
       int enviados = 0;
       int bytes_en_falta = *len;
       int n;
       while( enviados < *len ){
              n = send( remfd , buf+enviados , bytes_en_falta, 0 );
              if( n == -1){
                perror("send");
                break;
              }
              enviados += n;
              bytes_en_falta -= n;
           }
       return;
}



Gracias de antemano.


Ultima edición por AmorpH el 29/08/2005 6:40 am; editado 1 vez
Volver arriba
Alejandro_



Registrado: 26 Mar 2005
Mensajes: 252
Ubicación: Buenos Aires

MensajePublicado: 29/08/2005 4:36 am
Título: select()

Hola; select() no es una función de la biblioteca del C++, sino que se trata de una función miembro estática de la clase Socket de la ".NET Framework Class Library"

Creo que puede servirte el ejemplo que se muestra en:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemnetsocketssocketclassselecttopic.asp

Alejandro
Volver arriba
AmorpH



Registrado: 19 Jul 2005
Mensajes: 7

MensajePublicado: 29/08/2005 5:30 am
Título:

Este programa está en C, aún así ya miré la información referente a ella, se encuentra en las librerias Winsock en windows como puedes ver aquí:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/select_2.asp

Según ví se usa de la misma forma que en linux o unix pero también lo he probado en éstos y tampoco funciona.
Volver arriba
      Índice del Foro elrincondelc.com -> Programación en Servidores
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com