Выкарыстанне Telnet для праверкі выберыце ()

Я даволі новы для праграмавання/сокета Linux. Я выкарыстоўваю выберыце , каб праверыць злучэння ў маёй праграме сервера (гэта ў канчатковым выніку будзе сервер Chatroom). Я выкарыстоўваю телнет, каб праверыць яго і нешта дзіўнае адбываецца. Калі я першы запусціць телнет (телнет Localhost 5794), выберыце вяртае 1 і дадае новае падключэнне да майго спісу дэскрыптараў майстар-файла. Усё выглядае выдатна.

Але тады я спрабую ўвесці рэчы ў телнет і нічога не адбываецца. Выберыце вяртае 0, калі я не адкрыць новы сеанс Telnet.

Ці з'яўляецца выберыце толькі для пошуку новых злучэнняў? Я думаў, што я мог бы выкарыстаць яго для праверкі ўводу, а таксама. Ніжэй прыводзіцца копія майго кода (Гэта трохі брудны ў той момант, таму што я шалёна важдацца з ім за апошнія пару гадзін. Мне вельмі шкада)

#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
Пасля выберыце вяртанняў, вы выклікаеце прымаць , праўда? І тады вы выклікаеце прачытаць на сокеце, вернутага прымаць ?
дададзена аўтар Dietrich Epp, крыніца
<Код> прачытаць і RECV у асноўным тое ж самае для сокетаў. Ці мае maxFD калі-небудзь павялічваецца? Вы калі-небудзь дадаць новы сокет да fd_set?
дададзена аўтар Dietrich Epp, крыніца
Там няма ніякіх падставаў для канчатковага «яшчэ». Вы можаце атрымаць якое ўваходзіць злучэнне і ўваходныя дадзеныя ў той жа час.
дададзена аўтар EJP, крыніца
Выклікі функцыі NewConnect Accept і дадае дэскрыптар файла, які вяртаецца ў асноўны спіс, але я не назваў чытаць далей ... Я паспрабую гэта цяпер.
дададзена аўтар James - not really a pirate, крыніца
Ok..acually, я не ўпэўнены, што чытаць павінен рабіць. Выклікі функцыі checkConnections ПРЫЁМ, каб атрымаць ўваход. Я павінен выкарыстоўваць для чытання для гэтага? Ці прачытае дазвольце мне называць ПРЫЁМ пазней.
дададзена аўтар 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 : адзін у <асноўнай код /> функцыі і адзін у newConnection функцыя. Змена аднаго не мяняе іншы. Рэкамендацыя: выкарыстоўваць глабальны замест гэтага. (Прычына: Існуе толькі адзін для ўсяго прыкладання і многія функцыі павінны атрымаць да яго доступ.)

Гэта вельмі, вельмі асноўная памылка. Калі вы не б'яце лоб і сказаць, «D'ой, гэта відавочна», то вы можаце вярнуцца назад і перагледзець інтра да праграмавання кнізе.

1
дададзена
Вялікае вам дзякуй !!! Гэта зафіксаваў яго цалкам. You сэр (ці мэм) мой герой!
дададзена аўтар James - not really a pirate, крыніца
Так. Я адчуваю сябе такой дурной.
дададзена аўтар James - not really a pirate, крыніца