fds->fd_array[0] unter LINUX ?!



  • Hallo Forum,

    TELNET_T *read_fd(fd_set *fds)
    {
      int i;
    
      for (i = 0, telnetpoi = telnettbl; i < MAXTELNET; i++, telnetpoi++)
      {
    	  if (telnetpoi->aktiv)
    	  {
    
    			 if (telnetpoi->sock == fds->fd_array[0])
            	 {
            		 ulink((LEHEAD *)telnetpoi);
            		 relink((LEHEAD *)telnetpoi, (LEHEAD *)h_llp->tail);
            		 return(telnetpoi);
    			 }
    	 }
      }
     return(telnetpoi);
    }
    

    Der Code geht ohne Probleme unter Win32, aber unter LINUX bekomme
    ich folgende Fehlermeldung:

    structure has no member named `fd_array

    Was muss ich aendern das es geht ?!

    mfg Oliver Kern.



  • Hallo,

    versuche

    ...
    if (telnetpoi->sock == fds->__fds_bits[0])
    ...
    

    bzw.

    ...
    if (telnetpoi->sock == fds->fds_bits[0])
    ...
    

    MfG



  • Hallo Forum,

    ...
    if (telnetpoi->sock == fds->__fds_bits[0])
    ...

    das funktioniert zwar, aber beim vergleichen der werte von
    telnetpoi->sock und fds->__fds_bits[0] geht irgendwas schief.

    Wertzuweisung fuer telnetpoi->sock:

    j = accept(fd_telnet, (struct sockaddr *) &peeraddr_in, &addrlen);
     ...
     telnetpoi->sock = j;
    

    nun kommt eine erneuerte anfrage vom eingeloggten User bzw. ich habe
    den sock-wert und will den vergleichen:

    telnetpoi = read_fd(&fds);
       ...
       TELNET_T *read_fd(fd_set *fds)
       {
        LHEAD  *h_llp;
        int i;
        h_llp = &telnetactl;
    
        for (i = 0, telnetpoi = telnettbl; i < MAXTELNET; i++, telnetpoi++)
        {
         if (telnetpoi->aktiv)
           {
           if (telnetpoi->sock == fds->__fds_bits[0])
            	 {
          	 ulink((LEHEAD *)telnetpoi);
          	 relink((LEHEAD *)telnetpoi, (LEHEAD *)h_llp->tail);
          	 return(telnetpoi);
    	 }
         }
      }
     return(FALSE);
    }
    

    normal muesste telnetpoi->sock und fds->__fds_bits[0] gleiche werte
    haben, aber fds->__fds_bits[0] 64
    [1] 0 <31x>

    uebrigens der wert in telnetpoi->sock ist 6
    oder muss der wert aufgerundet werden ?!
    ist das ueberhaupt die richtige variable __fds_bits[0] ?!

    mfg Oliver Kern.



  • FD_SET
    FD_ISSET

    versuch mal FD_SET und FD_ISSET



  • diese funktion faengt die socketanfragen ab:

    int telnet_recv(fd_set rset)
      {
        int    count    = -1;
        int    max_sock = -1;
        struct timeval  timevalue;
        int    j        = -1;
        int    addrlen  = -1;
        ULONG  peerip   = 0;
        UBYTE  ip[17];
    
        if (!telnet_active)
    	return(-1);
    
          timevalue.tv_usec = 10000;
          timevalue.tv_sec = 0;
    
          FD_ZERO(&fds);
    
          /* sind User in der Liste, muessen die */
          /* sock-werte in fds eingetragen werden.*/
          /* Das macht die funtkion get_fds. */
          max_sock = get_fds(&fds);
          if (fd_telnet > max_sock)
    	max_sock = fd_telnet;
    
          FD_SET(fd_telnet, &fds);
    
          count = select(max_sock + 1, &fds, NULL, NULL, &timevalue);
    
          if (count == 0 || count == -1)
            return(-1);
    
          if (FD_ISSET(fd_telnet,&fds))
          {
    	addrlen = sizeof peeraddr_in;
    	j = accept(fd_telnet, (struct sockaddr *) &peeraddr_in, &addrlen);
    	if (j != EOF) {
             peerip = peeraddr_in.sin_addr.s_addr;
             strcpy (ip, in_ntoa (peerip));
             /* Neuen User in der Liste aufnehmen. */
             /* bekannt ist der sock-Wert und die IP-Adresse. */
            telnetpoi = TelnetUser(j,ip);
            return(FALSE);
            }
          }
         /* User aus der Liste holen.   */
         /* Der Sock-Wert steht in fds. */
         telnetpoi = read_fd(&fds);
         /* empfangen und senden an User. */
         lese_socket(telnetpoi);
        return(FALSE);
    }
    

    Unter Win32 sind die Variablen telnetpoi->sock und fds gleich, nur
    unter LINUX will das nicht so recht.

    mfg Oliver Kern.



  • das ist schrott !!!

    if (telnetpoi->sock == fds->fd_array[0])

    so waere die richtige Implementierung:

    if (FD_ISSET(telnetpoi->sock,fds))
    

    es kann doch so einfach sein .....

    mfg Oliver Kern.
    PS: Vielen Dank noch an Felix Opitz.


Anmelden zum Antworten