Telnet қызметін таңдау үшін select ()

Мен Linux/socket бағдарламалау үшін өте жаңа. Мен сервер бағдарламасында қосылымдарды тексеру үшін таңдау пайдаланамын (ол кейінірек сөйлесу бөлмесінің сервері болады). Мен оны тестілеу үшін телнұсқаны пайдаланып жатырмын. Telnet (telnet localhost 5794) бірінші рет іске қосылғанда, таңдау 1 мәнін қайтарады және менің басты файлды дескриптор тізіміне қосады. Барлық жақсы көрінеді.

Бірақ содан кейін мен телнұсқаны теруге тырысамын және ештеңе болмайды. Жаңа telnet сеансын ашпайынша 0 мәнін қайтарады.

таңдау тек жаңа қосылымдарды табу үшін бар ма? Мен кірісті тексеру үшін оны пайдалана алатынымды ойладым. Төменде менің кодымның көшірмесі (Бұл соңғы сәтте бірнеше сағат бойы қызықтырып жібергендіктен, ол сәл азаяды, кешіріңіз)

#include "chatpacket.cpp"
#include "serverFunctions.cpp"

#define SERVER_PORT 5794
#define MAX_PENDING 10

int main() {
  fd_set connections;
  fd_set waitingConnections;
  user *clients = new user[50];
  int serverSocket = ServerSetup (SERVER_PORT, MAX_PENDING);
  int maxFD = serverSocket;
  int ConnectionCount;

  struct timeval tv;

  FD_ZERO(&connections);
  FD_SET(0, &connections);
  FD_SET(serverSocket, &connections);

  tv.tv_sec = 1;
  tv.tv_usec = 100;

  bool shutdown = false;
  bool tmpflag = true;
  while(!shutdown) { 

    if (tmpflag == true){printf("in the loop!\n");tmpflag=false;}
    waitingConnections = connections;

    ConnectionCount = select((maxFD+1), &waitingConnections, NULL, NULL, &tv);

    if (ConnectionCount == -1) {
        ///HANDLE ERROR!!!!!!
        printf("Connection Error!");
    }
    else if (ConnectionCount > 0) {
      if (FD_ISSET(serverSocket, &waitingConnections)){
           newConnection(serverSocket, connections, maxFD, clients); //this works fine
      }
      else {
           checkConnections(clients, waitingConnections, maxFD); //the code never gets here
      }
    }

    //check keyboard
    shutdown = checkKeyboard();

  }
}

EDIT: NewConnection үшін код:

bool newConnection(int serverSocket, fd_set& ConnectionList, int maxFD, user* userGroup){
    printf("in newConnection\n");
    struct sockaddr_storage remoteaddr;

    socklen_t addrlen = sizeof remoteaddr;

    int newFD = accept(serverSocket,(struct sockaddr *)&remoteaddr,&addrlen);
    FD_SET(newFD, &ConnectionList);

    if (newFD > maxFD)
        maxFD = newFD;

    printf("We have a new connection!!! (newConnetcion)\n");

    bool userAdded = false;
    for (int i = 0; i < 50; i++){
      if (userGroup[i].active == false){
            userGroup[i].socket = newFD;
            userGroup[i].active = true;
            userAdded = true;
                        printf("User added in the %ith position of the array.(socket number %i)\n",i,newFD);
            break;
      }
    }
    if (!userAdded)
        printf("new user was not added! (newConnetcion)\n");
}

CheckConnections функциясының басында printf бар, сондықтан ол функцияға кірген кезде көре аламын. Ол ешқашан басып шығармайды.

1
таңдау қайтарғаннан кейін accept деп теріңіз, оң? Сонда accept арқылы қайтарылған ұяшықта read деп аталады?
қосылды автор Dietrich Epp, көзі
read және recv негізінен ұялар үшін бірдей. maxFD әрқашан артуы керек пе? Сіз жаңа розетканы fd_set-ге қосасыз ба?
қосылды автор Dietrich Epp, көзі
Соңғы 'else' үшін ешқандай себеп жоқ. Сіз бір уақытта кіріс деректерін және кіретін деректерді ала аласыз.
қосылды автор EJP, көзі
NewConnect функциясы Қабылдауды қабылдайды және негізгі тізімге қайтарылған файлды дескрипторды қосады, бірақ мен оны оқымадым ... Қазір бұл әрекетті жасаймын.
қосылды автор James - not really a pirate, көзі
Әрине, мен оқылымның қандай болатынына сенімді емеспін. CheckConnections функциясы кіріс алу үшін recv деп аталады. Мен бұл үшін оқуды қолданамын ба? Немесе кейінірек қайта қоңырау шалуға рұқсат етіңіз.
қосылды автор James - not really a pirate, көзі
иә және иә. Сұраққа checkConnections кодын енгіздім. Мүмкін, мен жай ғана жоғалып кететін бір нәрсе бар. Сіздің көмегіңізді шынымен бағалаймын.
қосылды автор James - not really a pirate, көзі

1 жауаптар

Міне мәселе.

int main(int argc, char *argv[])
{
    int maxFD = ...;
    ...
    newConnection(..., maxFD, ...);
    ...
}

void newConnection(..., int maxFD, ...)
{
    ...
    if (newFD > maxFD)
        maxFD = newFD;
    ...
}

maxFD деп аталатын екі айнымалы: бір main функциясындағы және newConnection функциясындағы біреуі бар екенін ескеріңіз. Өзгерту бірін өзгертпейді. Ұсыныс: орнына жаһандық пайдаланыңыз. (Себеп: Қолдануға тек бір ғана мүмкіндік бар және оған көптеген функциялар қажет.)

Бұл өте қарапайым қателік. Егер сіз маңдайыңыздан қашып кетпесеңіз және «Д'Ох, бұл анық» деп айтпасаңыз, сіз қайтадан оралуға және бағдарламалау кітабына енгізілген кіріспе сөздерді қайта қарастырғыңыз келуі мүмкін.

1
қосылды
Көп рақмет сізге!!! Бұл оны толықтай тіркеді. Сен (немесе мэм) - менің батырым!
қосылды автор James - not really a pirate, көзі
Иә. Мен өзімді ақымақтық сезінемін.
қосылды автор James - not really a pirate, көзі