Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Кол-во дескрипторов процесса.

314
04 сентября 2008 года
fanto
374 / / 15.02.2003
Суть такая:
Пишу сервер.Многопоточный. Принимает коннекты.
Задача стоит в том, чтобы при достижении определенного кол-ва открытых
сокетов, новые коннекты не принимать.(коннекты иногда раскидываются
по разным потокам)
Я ,в принципе, могу опросить каждый тред на кол-во используемых им сокетов, но это долго, мрачно и лишний повод для глюков.

Можно ли как-то спросить у системы сколько дескрипторов использует
программа?
502
04 сентября 2008 года
Jail
550 / / 30.01.2007
Цитата: fanto
Суть такая:
Пишу сервер.Многопоточный. Принимает коннекты.
Задача стоит в том, чтобы при достижении определенного кол-ва открытых
сокетов, новые коннекты не принимать.(коннекты иногда раскидываются
по разным потокам)
Я ,в принципе, могу опросить каждый тред на кол-во используемых им сокетов, но это долго, мрачно и лишний повод для глюков.

Можно ли как-то спросить у системы сколько дескрипторов использует
программа?


Можно создать что-то напоминающее listen sockets и прослушивать колличество открытых сокетов. Если ты будешь пытаться найти вывод подобной информации системными средствами, то с наибольшей долей вероятности то - что ты получить абсолютно не кросплатформенное приложение (думаю не стоит пояснять как это сейчас необходимо и все такое...). На Линюкс допустим будет работать, а вот на BSD системах или в Solaris Environment уже нет. Вот когда в среду Linux, BSD и MacOS X портируют DTrace из Solaris, тогда подобные штуки станут возможными, а пока думаю будет полезным что-то типа listen sockets:

Код:
/* create a socket listening on port 'port' */
/* if af is PF_UNSPEC more than one socket might be returned */
/* the returned list is dynamically allocated, so caller needs to free it */
int *listensock(const char *port, const int af)
{
    struct addrinfo hints, *ai, *r;
    int err, maxs, *sock, *socks;
    const int on = 1;

    memset(&hints, 0, sizeof(hints));
    hints.ai_flags = AI_PASSIVE;
    hints.ai_family = af;
    hints.ai_socktype = SOCK_STREAM;
    err = getaddrinfo(NULL, port, &hints, &ai);
    if (err) {
    fprintf(stderr, "%s\n", gai_strerror(err));
    exit(EX_USAGE);
    }

    /* Count max number of sockets we can open */
    for (maxs = 0, r = ai; r; r = r->ai_next, maxs++)
    ;
    socks = malloc((maxs + 1) * sizeof(int));
    if (!socks) {
    fprintf(stderr, "couldn't allocate memory for sockets\n");
    freeaddrinfo(ai);
    exit(EX_OSERR);
    }

    socks[0] = 0;    /* num of sockets counter at start of array */
    sock = socks + 1;
    for (r = ai; r; r = r->ai_next) {
    fprintf(stderr, "trying %d, %d, %d\n",r->ai_family, r->ai_socktype, r->ai_protocol);
    *sock = socket(r->ai_family, r->ai_socktype, r->ai_protocol);
    if (*sock < 0) {
        perror("socket");
        continue;
    }
    if (setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR,
               (void *) &on, sizeof(on)) < 0) {
        perror("setsockopt(SO_REUSEADDR)");
        close(*sock);
        continue;
    }
#if defined(IPV6_V6ONLY) && !(defined(__FreeBSD__) && __FreeBSD__ < 3)
    if (r->ai_family == AF_INET6) {
        if (setsockopt(*sock, IPPROTO_IPV6, IPV6_BINDV6ONLY,
               (void *) &on, sizeof(on)) < 0) {
        perror("setsockopt (IPV6_BINDV6ONLY)");
        close(*sock);
        continue;
        }
    }
#endif
    if (bind(*sock, r->ai_addr, r->ai_addrlen) < 0) {
        perror("bind");
        close(*sock);
        continue;
     }

     if (listen(*sock, 5) < 0) {
         perror("listen");
         close(*sock);
         continue;
     }

     socks[0]++;
     sock++;
    }

    freeaddrinfo(ai);

    if (socks[0] == 0) {
     fprintf(stderr, "Couldn't bind to any socket\n");
     free(socks);
    exit(EX_OSERR);
    }

    return socks;
}

Возникнут вопросы, могу кинуть готовый исходник, где работает эта функция.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог