Probleme mit recv



  • Hallo

    Beim Empfangen von Daten versucht recv eine lange Zeit Daten zu empfangen, ob keine Daten mehr vorhanden sind.

    mfg
    funcky29

    SOCKET sd;
    struct sockaddr_in box; //Adresse des Com-Servers
    
    /*
    ** initialiesiert die variable box und versucht einen Socket zu öffnen
    */
    int sc_open(char *hostname, int portnr)
    {
    	HOSTENT *he;
    
    	WSADATA wsaData;
    	if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) {
    		printf("The initialization of WinSock failed. Make sure that you have installed WinSock 2.0 or higher.");
    		return(0);
    	}
    
    	he = (HOSTENT *)gethostbyname(hostname);
    	if(he)
    	{
    		CopyMemory(&box.sin_addr, he->h_addr, sizeof box.sin_addr);
    	}
    	else{
    		printf("Host nicht gefunden");
    		return(0);
    	}
    
    	box.sin_family = AF_INET;
    	box.sin_port = htons(portnr); //Ziel Port-Nummer
    
    	sd = -1;
    
    	//öffne Handle für TCP-Transport
    	if((sd = socket(PF_INET,SOCK_STREAM, 0)) < 0)
    	{
    		printf("socket error");
    		sd = -1;
    		return(0);
    	}
    
    	//öffne Verbindung zum COM-Server Port
    	if(connect (sd, (struct sockaddr*)&box,sizeof(box)) < 0)
    	{ 
    		closesocket(sd); //schließe Handle wieder
    		printf("connect error");
    		sd = -1;
    		return(0);
    	}
    
    	return(1);
    }
    
    void sc_read()
    {
      fd_set rd_ready; //Bitfelder pro Socket-Deskriptor
      struct timeval maxwait;
      int len = 0;
      char RecBuf[1024];
    
      while(1){
        FD_ZERO(&rd_ready);
        FD_SET (sd,&rd_ready);
        maxwait.tv_sec = 0;
        maxwait.tv_usec = 200;
    
        if(select(sd+1,&rd_ready,(fd_set*)0,(fd_set*)0,&maxwait) == 0) continue;
    
        if(FD_ISSET(sd, &rd_ready)) //liegen Daten vor?
        { 
    	  if((len=recv(sd, RecBuf, (sizeof(RecBuf)-1) ,0))>0)
    	  { 
    	    RecBuf[len] = '\0'; //markiere Stringende
    	    printf("%s", RecBuf);
    	  }
    	  else if(len == 0) //regulärer Verbindungsabbau
    	  { 
                 //Beim letzten Aufruf von recv, wo len == 0 ist
                 //bleibt es für eine Zeit lang hängen
    	    return;
    	  }
    	  else if(len <= 0) //Verbindungsfehler
    	  { 
    	    printf("read error");
    	    return;
    	  }
        }
      }
    }
    

Anmelden zum Antworten