Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов select грузит процессор, на 50% при постоянном соединении 
:(
    Опции темы
paradox91
Дата 26.5.2011, 10:39 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.5.2011

Репутация: нет
Всего: нет



Может уже были такие темы, но не смог найти. Написал TCP клиент для курсовой, задача клиента дать пользователю вводить с терминала и отправлять по соединения, а также принимать из соединения и отображать на терминале текстовую информацию.
Клиентская программа устанавливает соединение и входит в режим одновременного ожидания данных с терминала и со стороны через сокет.
Проблема в том, что когда устанавливается соединение - загрузка процессора примерно на планке 60%. Подскажите пожалуйста - как исправить..А то это неправильно как то)


Код программы:

Код

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PORT 12345

int main(int argc, char *argv[])
{
if(argc<2)
{
    puts("Arguments weren't given ./my_tcp_client<remote_ip><remote_port>");
}
int sock;
struct sockaddr_in addr,saddr;
    sock = socket(AF_INET, SOCK_STREAM, 0);
    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr =  htonl(atoi(argv[1]));
    saddr.sin_port = htons(atoi(argv[2]));
if(connect(sock, (struct sockaddr *)&saddr, sizeof(saddr)) < 0)
{
        perror("connect");
        exit(2);
}
char buf[1024]; char buf1[1024];
int count=0;
int buffull=0;
int buf1full=0;
fd_set readset, writeset;
while(1)
{
    //fd_set readset,writeset;
    FD_ZERO(&readset);
    FD_SET(sock, &readset);
    FD_SET(0, &readset);
    FD_ZERO(&writeset);
    FD_SET(sock, &writeset);
    FD_SET(1, &writeset);
    struct timeval timeout;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    if(select (sock+1, &readset, &writeset, NULL, &timeout) < 0)
    {
         perror("select");
         exit(3);
    }
    if (FD_ISSET(sock, &readset) && !buffull)
    {
        count = read (sock, buf, 1024);
        if(count <= 0)
         {
            puts("disconection");
            return 1;
        }
        printf("count: %d\n", count);
        write(1,buf,count);
        buffull=1;
    }
    if(FD_ISSET(0, &readset) && !buf1full)
    {
        count = read (0, buf1, 1024);
        buf1full=1;
        printf("count: %d\n", count);
    }
    if(FD_ISSET(1, &writeset) && buffull)
    {
        write(1, buf, count);
        buffull=0;
    }
    if(FD_ISSET(sock, &writeset) && buf1full)
    {
        write(sock, buf1, count);
        buf1full=0;
    }
}
return EXIT_SUCCESS;
}





Это сообщение отредактировал(а) paradox91 - 26.5.2011, 13:20
PM MAIL   Вверх
boostcoder
Дата 26.5.2011, 10:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



отформатируйте код. глаз жалко.
PM WWW   Вверх
GrayCardinal
Дата 26.5.2011, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



paradox91, 
Попробуйте struct timeval вынести вверх, за while


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 26.5.2011, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



я не вижу никаких причин чему-либо тормозить в этом коде..
PM WWW   Вверх
paradox91
Дата 26.5.2011, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.5.2011

Репутация: нет
Всего: нет



А есть вероятность того, что это сервер виноват? Для проверки всегда соединял с Эхо-сервером вот отсюда: http://www.rsdn.ru/article/unix/sockets.xml
PM MAIL   Вверх
svlary
Дата 27.5.2011, 05:17 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



В строке 47 у Вас стоит вызов select, у которого задан параметр &writeset.
В этом параметре Вы установили проверку 1-го дескриптора - stdout (строки 42-43) Вашего кода.
В момент запуска вашего приложения, stdout готов к записи. 
  • Поэтому функция select сразу "слетает" с ожидания и программа продолжает исполнение.
  • Так как переменные buffull и buf1full равны нулю, то ни один из операторов записи не срабатывает.
  • Поток управления достигает конца цикла и возвращается в начало.
  • Управление опять передается на select
  • Функция select опять информирует Вас о том, что stdout готов к записи
  • .....

PM MAIL   Вверх
GrayCardinal
Дата 27.5.2011, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



svlary, 
Однако. 
+1  smile 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.