Использование Telnet для проверки select () - PullRequest
1 голос
/ 28 октября 2011

Я довольно новичок в программировании Linux / сокетов.Я использую select для проверки соединений в моей серверной программе (в конечном итоге это будет сервер чата).Я использую telnet, чтобы проверить это, и происходит нечто странное.Когда я впервые запускаю telnet (telnet localhost 5794), select возвращает 1 и добавляет новое соединение в мой список дескрипторов основного файла.Все выглядит хорошо.

Но потом я пытаюсь набрать текст в telnet, и ничего не происходит.Выберите возвращает 0, если я не открываю новый сеанс Telnet.

Является ли select только для поиска новых соединений?Я думал, что смогу использовать его для проверки ввода.Ниже приведена копия моего кода (в настоящий момент он немного грязный, потому что я яростно возился с ним последние пару часов. Извините)для 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 Ответ

1 голос
/ 28 октября 2011

Вот проблема.

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

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

Обратите внимание, что есть две переменные с именем maxFD: одна в функции main и одна в newConnection.Изменение одного не меняет другого.Рекомендация: используйте вместо этого глобальный.(Причина: существует только одна программа для всего приложения, и многие функции должны иметь к ней доступ.)

Это очень простая ошибка.Если вы не чмокаете в лоб и говорите: «О, это очевидно», тогда вы можете вернуться и просмотреть вступление к книге по программированию.

...