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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] проблема с set 
V
    Опции темы
Ak47black
  Дата 16.10.2010, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Здравствуйте.
Вот такой у меня код
Код

#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <netinet/in.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <dirent.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <algorithm>
#include <set>

using namespace std;

struct clstruct
{
    int sock;
    DIR *d;
};

int main()
{
    int listener;
    struct sockaddr_in addr;
    char buf[1024];
    int bytes_read;
    struct dirent *de = NULL;

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }

    fcntl(listener, F_SETFL, O_NONBLOCK);

    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = INADDR_ANY;
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("bind");
        exit(2);
    }

    listen(listener, 2);

    set<clstruct> clients;
    
    clients.clear();

    while(1)
    {
        // Заполняем множество сокетов
        fd_set readset;
        FD_ZERO(&readset);
        FD_SET(listener, &readset);

        for(set<clstruct>::iterator it = clients.begin(); it != clients.end(); it++)
            FD_SET(it->sock, &readset);

        // Задаём таймаут
        timeval timeout;
        timeout.tv_sec = 15;
        timeout.tv_usec = 0;

        // Ждём события в одном из сокетов
        int mx = max(listener, *max_element(clients.begin()->sock, clients.end()->sock));
        if(select(mx+1, &readset, NULL, NULL, &timeout) <= 0)
        {
            perror("select");
            exit(3);
        }

        // Определяем тип события и выполняем соответствующие действия
        if(FD_ISSET(listener, &readset))
        {
            // Поступил новый запрос на соединение, используем accept
            int sock = accept(listener, NULL, NULL);
            if(sock < 0)
            {
                perror("accept");
                exit(3);
            }

            fcntl(sock, F_SETFL, O_NONBLOCK);

            clstruct temp;
            temp.sock = sock;
            clients.insert(temp);
        }

        for(set<clstruct>::iterator it = clients.begin(); it != clients.end(); it++)
        {
            if(FD_ISSET(it->sock, &readset))
            {
                // Поступили данные от клиента, читаем их
                bytes_read = recv(it->sock, buf, 1024, 0);

                if(bytes_read <= 0)
                {
                    // Соединение разорвано, удаляем сокет из множества
                    close(it->sock);
                    clients.erase(*it);
                    continue;
                }

                if (buf[0] == 1)
                    it->d = opendir(buf+1);
                if (buf[0] == 2)
                {
                    de = readdir(it->d);
                    if (de != NULL)
                    {
                        buf[0] = 2;
                        memcpy(buf+1, de->d_name, strlen(de->d_name));
                        if (send(it->sock, buf, strlen(buf+1)+1, 0)== -1)
                            fprintf(stderr, "Error sending data %d\n", errno);
                    }
                    else
                    {
                     buf[0] = -1;
                        if (send(it->sock, buf, 1, 0)== -1)
                            fprintf(stderr, "Error sending data %d\n", errno);
                    }


                }
            }
        }
    }

    return 0;
}

получаю ошибку
Цитата

server.cpp:80: error: invalid type argument of Б─≤unary *Б─≥
server.cpp:121: error: assignment of data-member Б─≤clstruct:smileБ─≥ in read-only structure

А вот такой
Код

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <algorithm>
#include <set>
using namespace std;

int main()
{
    int listener;
    struct sockaddr_in addr;
    char buf[1024];
    int bytes_read;

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }
    
    fcntl(listener, F_SETFL, O_NONBLOCK);
    
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = INADDR_ANY;
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("bind");
        exit(2);
    }

    listen(listener, 2);
    
    set<int> clients;
    clients.clear();

    while(1)
    {
        // Заполняем множество сокетов
        fd_set readset;
        FD_ZERO(&readset);
        FD_SET(listener, &readset);

        for(set<int>::iterator it = clients.begin(); it != clients.end(); it++)
            FD_SET(*it, &readset);

        // Задаём таймаут
        timeval timeout;
        timeout.tv_sec = 15;
        timeout.tv_usec = 0;

        // Ждём события в одном из сокетов
        int mx = max(listener, *max_element(clients.begin(), clients.end()));
        if(select(mx+1, &readset, NULL, NULL, &timeout) <= 0)
        {
            perror("select");
            exit(3);
        }
        
        // Определяем тип события и выполняем соответствующие действия
        if(FD_ISSET(listener, &readset))
        {
            // Поступил новый запрос на соединение, используем accept
            int sock = accept(listener, NULL, NULL);
            if(sock < 0)
            {
                perror("accept");
                exit(3);
            }
            
            fcntl(sock, F_SETFL, O_NONBLOCK);

            clients.insert(sock);
        }

        for(set<int>::iterator it = clients.begin(); it != clients.end(); it++)
        {
            if(FD_ISSET(*it, &readset))
            {
                // Поступили данные от клиента, читаем их
                bytes_read = recv(*it, buf, 1024, 0);

                if(bytes_read <= 0)
                {
                    // Соединение разорвано, удаляем сокет из множества
                    close(*it);
                    clients.erase(*it);
                    continue;
                }

                // Отправляем данные обратно клиенту
                send(*it, buf, bytes_read, 0);
            }
        }
    }
    
    return 0;
}

получается без ошибок.
Подскажите, как мне правильно быть здесь
Код

int mx = max(listener, *max_element(clients.begin()->sock, clients.end()->sock));

и здесь
Код

it->d = opendir(buf+1);

??  smile

Добавлено @ 17:00
Я тут просто пытаюсь сделать что-бы с каждым сокетом ещё хранился дескриптор.
(Делаю простой клиент-сервер запроса содержимого каталога)

Это сообщение отредактировал(а) Ak47black - 16.10.2010, 17:00
PM MAIL   Вверх
Crafty
Дата 16.10.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

int mx = max(listener, *max_element(clients.begin()->sock, clients.end()->sock));


Здесь ты обращаешься к несуществующему элементу:
Код

clients.end()->sock

Попробуй вот так
Код

(clients.end() - 1)->sock

PM MAIL   Вверх
Ak47black
Дата 16.10.2010, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Попробовал
Код

        int mx = max(listener, *max_element(clients.begin()->sock, (clients.end() - 1)->sock));

Цитата

server.cpp:80: error: no match for Б─≤operator-Б─≥ in Б─≤clients.std::set<_Key, _Compare, _Alloc>::end [with _Key = clstruct, _Compare = std::less<clstruct>, _Alloc = std::allocator<clstruct>]() - 1Б─≥


Добавлено @ 17:51
Цитата(Crafty @  16.10.2010,  17:44 Найти цитируемый пост)
Попробуй вот так
Выделить всёкод C++
1:
    
(clients.end() - 1)->sock

Мне кажется тут не это. Изза того, что во втором моём коде
Код

int mx = max(listener, *max_element(clients.begin(), clients.end()));

работает

Это сообщение отредактировал(а) Ak47black - 16.10.2010, 17:51
PM MAIL   Вверх
Crafty
Дата 16.10.2010, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Попробуй ещё так    
Код

(--clients.end() )->sock

PM MAIL   Вверх
Ak47black
Дата 16.10.2010, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Crafty @ 16.10.2010,  17:51)
Попробуй ещё так    
Код

(--clients.end() )->sock

Цитата

server.cpp:80: error: invalid type argument of Б─≤unary *Б─≥


Добавлено @ 17:58
clients.end() по сути возвращает последний элемент. Тоесть в моём случает это структура.
Получается что 
clients.end()->sock(в первом) тоже самое что clients.end() во втором моём коде.
А где ошибка немогу понять  smile

Добавлено @ 18:04
Цитата(Crafty @ 16.10.2010,  17:51)
Попробуй ещё так    
Код

(--clients.end() )->sock

Думаю, тут не из-за этого так как ошибка возникает во время компиляции

Это сообщение отредактировал(а) Ak47black - 16.10.2010, 18:11
PM MAIL   Вверх
Ak47black
Дата 16.10.2010, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



С 80 строкой понял
тут
Код

int mx = max(listener, max_element(clients.begin(), clients.end())->sock);

PM MAIL   Вверх
Crafty
Дата 16.10.2010, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ещё можно попробовать оператор разыменования убрать перед max_element.
Код

int mx = max(listener, max_element(clients.begin()->sock, (--clients.end())->sock));

Хотя это тоже не верно.
Нашёл ф-цию  max_element (ссылка), ей нужно передавать два итератора и возвращает она итератор на макс элемемент.
То есть нужно делать или как во втором примере или передавать также два итератора и написать ф-цию для сравнения элемнтов через it->socket

Добавлено @ 18:40
Цитата(Ak47black @  16.10.2010,  19:38 Найти цитируемый пост)
С 80 строкой понял
тут


Понятно.

Добавлено через 7 минут и 30 секунд
А тут 
Код

it->d = opendir(buf+1);

Вообще-то изменять значения эл-тов сета нельзя, они константны, их можно только добавлять и удалять.

Добавлено через 10 минут и 29 секунд
Тут посмотрите ссылка.

Это сообщение отредактировал(а) Crafty - 16.10.2010, 18:41
PM MAIL   Вверх
Ak47black
Дата 16.10.2010, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Crafty @  16.10.2010,  18:39 Найти цитируемый пост)
Вообще-то изменять значения эл-тов сета нельзя, они константны, их можно только добавлять и удалять.

Я вот над этим в данным момент и сижу smile

Добавлено @ 19:03
 А как насчет того что-бы там хранить указатель на указатель на DIR?

Вот такой код у меня получился 

Код

#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <netinet/in.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <dirent.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <algorithm>
#include <set>

using namespace std;

struct clstruct
{
    int sock;
    DIR **d;
};

int main()
{
    int listener;
    struct sockaddr_in addr;
    char buf[1024];
    int bytes_read;
    struct dirent *de = NULL;

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }

    fcntl(listener, F_SETFL, O_NONBLOCK);

    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = INADDR_ANY;
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("bind");
        exit(2);
    }

    listen(listener, 2);

    set<clstruct> clients;
    
    clients.clear();

    while(1)
    {
        // Заполняем множество сокетов
        fd_set readset;
        FD_ZERO(&readset);
        FD_SET(listener, &readset);

        for(set<clstruct>::iterator it = clients.begin(); it != clients.end(); it++)
            FD_SET(it->sock, &readset);

        // Задаём таймаут
        timeval timeout;
        timeout.tv_sec = 15;
        timeout.tv_usec = 0;

        // Ждём события в одном из сокетов
        int mx = max(listener, max_element(clients.begin(), clients.end())->sock);
        if(select(mx+1, &readset, NULL, NULL, &timeout) <= 0)
        {
            perror("select");
            exit(3);
        }

        // Определяем тип события и выполняем соответствующие действия
        if(FD_ISSET(listener, &readset))
        {
            // Поступил новый запрос на соединение, используем accept
            int sock = accept(listener, NULL, NULL);
            if(sock < 0)
            {
                perror("accept");
                exit(3);
            }

            fcntl(sock, F_SETFL, O_NONBLOCK);

            clstruct temp;
            temp.sock = sock;
            temp.d = (DIR**)malloc(sizeof(DIR*));
            clients.insert(temp);
        }

        for(set<clstruct>::iterator it = clients.begin(); it != clients.end(); it++)
        {
            if(FD_ISSET(it->sock, &readset))
            {
                // Поступили данные от клиента, читаем их
                bytes_read = recv(it->sock, buf, 1024, 0);

                if(bytes_read <= 0)
                {
                    // Соединение разорвано, удаляем сокет из множества
                    close(it->sock);
                    clients.erase(*it);
                    continue;
                }

                if (buf[0] == 1)
                    *it->d = opendir(buf+1);
                if (buf[0] == 2)
                {
                    de = readdir(*it->d);
                    if (de != NULL)
                    {
                        buf[0] = 2;
                        memcpy(buf+1, de->d_name, strlen(de->d_name));
                        if (send(it->sock, buf, strlen(buf+1)+1, 0)== -1)
                            fprintf(stderr, "Error sending data %d\n", errno);
                    }
                    else
                    {
                     buf[0] = -1;
                        if (send(it->sock, buf, 1, 0)== -1)
                            fprintf(stderr, "Error sending data %d\n", errno);
                    }


                }
            }
        }
    }

    return 0;
}

Но вижу кучу странных ошибок
Цитата

 g++ server.cpp
/usr/include/c++/4.3/bits/stl_algo.h: In function Б─≤_FIter std::max_element(_FIter, _FIter) [with _FIter = std::_Rb_tree_const_iterator<clstruct>]Б─≥:
server.cpp:80:   instantiated from here
/usr/include/c++/4.3/bits/stl_algo.h:5601: error: no match for Б─≤operator<Б─≥ in Б─≤__result.std::_Rb_tree_const_iterator<_Tp>::operator* [with _Tp = clstruct]() < __first.std::_Rb_tree_const_iterator<_Tp>::operator* [with _Tp = clstruct]()Б─≥
/usr/include/c++/4.3/bits/stl_function.h: In member function Б─≤bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = clstruct]Б─≥:
/usr/include/c++/4.3/bits/stl_tree.h:1141:   instantiated from Б─≤std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = clstruct, _Val = clstruct, _KeyOfValue = std::_Identity<clstruct>, _Compare = std::less<clstruct>, _Alloc = std::allocator<clstruct>]Б─≥
/usr/include/c++/4.3/bits/stl_set.h:381:   instantiated from Б─≤std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const _Key&) [with _Key = clstruct, _Compare = std::less<clstruct>, _Alloc = std::allocator<clstruct>]Б─≥
server.cpp:103:   instantiated from here
/usr/include/c++/4.3/bits/stl_function.h:230: error: no match for Б─≤operator<Б─≥ in Б─≤__x < __yБ─≥

Добавлено @ 19:06
Я компилирую с g++

Добавлено @ 19:14
Что-то с 80 строкой по прежнему

Это сообщение отредактировал(а) Ak47black - 16.10.2010, 19:15
PM MAIL   Вверх
Ak47black
Дата 16.10.2010, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Буду ждать Ваших ответов по последнему коду и ошибкам в нём, так как сам я в этом лесу уже полностью "заблудился".  smile 
PM MAIL   Вверх
586
Дата 16.10.2010, 22:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В std::set элементы находятся в отсортированном состоянии, и максимальный элемент находится в *(--clients.end()). Использовать std::max_element смысла нет.
И std::set не будет компилироваться без перегруженного оператора сравнения:
Код
#include <set>

struct A {
  int value;
  /*bool operator < (const A &a) const 
  {
    return (value < a.value);
  }*/
};

int main()
{
  std::set<A> x;
}

Цитата
include/c++/4.1.2/bits/stl_function.h: In member function 'bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = A]':
include/c++/4.1.2/bits/boost_concept_check.h:358:   instantiated from 'void __gnu_cxx::_BinaryFunctionConcept<_Func, _Return, _First, _Second>::__constraints() [with _Func = std::less<A>, _Return = bool, _First = A, _Second = A]'
include/c++/4.1.2/bits/stl_set.h:112:   instantiated from '__gnu_norm::set<A, std::less<A>, std::allocator<A> >'
include/c++/4.1.2/debug/set.h:45:   instantiated from '__gnu_debug_def::set<A, std::less<A>, std::allocator<A> >'
t.cpp:14:   instantiated from here
Line 226: error: no match for 'operator<' in '__x < __y'
compilation terminated due to -Wfatal-errors.


Это сообщение отредактировал(а) 586 - 16.10.2010, 22:32
PM   Вверх
Crafty
Дата 17.10.2010, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Только operator< лучше определять как не член класса.
Код

bool operator<(const clstruct &lhs, const clstruct &rhs)
{
    return lhs.sock < rhs.sock;
}

PM MAIL   Вверх
Ak47black
Дата 17.10.2010, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Непойму никак.
Слушайте подскажите вот что, есть-ли что-то другое в C++ для моего случая.
У меня (в данном случае это сервер) нужно сделать что-то вроде динамического списка, так как обычный массив не подходит в силу того что клиент может находится в середине массива. (или легче уж выкручиваться с массивом)

И если ничего хорошего нету, то покажите пожалуйста как мне вставить поправки приведенные выше в мой код что-бы он запустился и стал рабочим.

Это сообщение отредактировал(а) Ak47black - 17.10.2010, 13:30
PM MAIL   Вверх
Ak47black
Дата 17.10.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Никто с такими структурами дынных не работал?  smile 
PM MAIL   Вверх
mes
Дата 17.10.2010, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Ak47black @  17.10.2010,  17:14 Найти цитируемый пост)
Никто с такими структурами дынных не работал?    

скорей всего многим просто лень вникать в суть проблемы, которую вы довольно таки, на мой взгляд, туманно описали .. 



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


Эксперт
****


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

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



Цитата(mes @  17.10.2010,  18:21 Найти цитируемый пост)
скорей всего многим просто лень вникать в суть проблемы, которую вы довольно таки, на мой взгляд, туманно описали .. 


Да вот незнаю, как более яснее преподнести
Есть код
Код

#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <netinet/in.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <dirent.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <algorithm>
#include <set>
using namespace std;
struct clstruct
{
    int sock;
    DIR **d;
};
int main()
{
    int listener;
    struct sockaddr_in addr;
    char buf[1024];
    int bytes_read;
    struct dirent *de = NULL;
    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }
    fcntl(listener, F_SETFL, O_NONBLOCK);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = INADDR_ANY;
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("bind");
        exit(2);
    }
    listen(listener, 2);
    set<clstruct> clients;
    
    clients.clear();
    while(1)
    {
        // Заполняем множество сокетов
        fd_set readset;
        FD_ZERO(&readset);
        FD_SET(listener, &readset);
        for(set<clstruct>::iterator it = clients.begin(); it != clients.end(); it++)
            FD_SET(it->sock, &readset);
        // Задаём таймаут
        timeval timeout;
        timeout.tv_sec = 15;
        timeout.tv_usec = 0;
        // Ждём события в одном из сокетов
        int mx = max(listener, max_element(clients.begin(), clients.end())->sock);
        if(select(mx+1, &readset, NULL, NULL, &timeout) <= 0)
        {
            perror("select");
            exit(3);
        }
        // Определяем тип события и выполняем соответствующие действия
        if(FD_ISSET(listener, &readset))
        {
            // Поступил новый запрос на соединение, используем accept
            int sock = accept(listener, NULL, NULL);
            if(sock < 0)
            {
                perror("accept");
                exit(3);
            }
            fcntl(sock, F_SETFL, O_NONBLOCK);
            clstruct temp;
            temp.sock = sock;
            temp.d = (DIR**)malloc(sizeof(DIR*));
            clients.insert(temp);
        }
        for(set<clstruct>::iterator it = clients.begin(); it != clients.end(); it++)
        {
            if(FD_ISSET(it->sock, &readset))
            {
                // Поступили данные от клиента, читаем их
                bytes_read = recv(it->sock, buf, 1024, 0);
                if(bytes_read <= 0)
                {
                    // Соединение разорвано, удаляем сокет из множества
                    close(it->sock);
                    clients.erase(*it);
                    continue;
                }
                if (buf[0] == 1)
                    *it->d = opendir(buf+1);
                if (buf[0] == 2)
                {
                    de = readdir(*it->d);
                    if (de != NULL)
                    {
                        buf[0] = 2;
                        memcpy(buf+1, de->d_name, strlen(de->d_name));
                        if (send(it->sock, buf, strlen(buf+1)+1, 0)== -1)
                            fprintf(stderr, "Error sending data %d\n", errno);
                    }
                    else
                    {
                     buf[0] = -1;
                        if (send(it->sock, buf, 1, 0)== -1)
                            fprintf(stderr, "Error sending data %d\n", errno);
                    }
                }
            }
        }
    }
    return 0;
}

получаю ошибки
Цитата

/usr/include/c++/4.3/bits/stl_algo.h: In function Б─≤_FIter std::max_element(_FIter, _FIter) [with _FIter = std::_Rb_tree_const_iterator<clstruct>]Б─≥:
server.cpp:80:   instantiated from here
/usr/include/c++/4.3/bits/stl_algo.h:5601: error: no match for Б─≤operator<Б─≥ in Б─≤__result.std::_Rb_tree_const_iterator<_Tp>::operator* [with _Tp = clstruct]() < __first.std::_Rb_tree_const_iterator<_Tp>::operator* [with _Tp = clstruct]()Б─≥
/usr/include/c++/4.3/bits/stl_function.h: In member function Б─≤bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = clstruct]Б─≥:
/usr/include/c++/4.3/bits/stl_tree.h:1141:   instantiated from Б─≤std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = clstruct, _Val = clstruct, _KeyOfValue = std::_Identity<clstruct>, _Compare = std::less<clstruct>, _Alloc = std::allocator<clstruct>]Б─≥
/usr/include/c++/4.3/bits/stl_set.h:381:   instantiated from Б─≤std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const _Key&) [with _Key = clstruct, _Compare = std::less<clstruct>, _Alloc = std::allocator<clstruct>]Б─≥
server.cpp:103:   instantiated from here
/usr/include/c++/4.3/bits/stl_function.h:230: error: no match for Б─≤operator<Б─≥ in Б─≤__x < __yБ─≥

из ошибок видно что проблема на строке
Код

int mx = max(listener, max_element(clients.begin(), clients.end())->sock);

и
Код

clients.insert(temp);

Немогу понять как исправить.

Ошибка появилась из-за объявления set<int> clients; на set<clstruct> clients;
и переправки других частей связанных с этим соответственно.

Добавлено @ 18:51
структура clstruct мне нужна для хранения переменной DIR* вместе с sock для каждого клиента.
Изза того что в set нельзя изменять данные после вставки,  то пытаюсь хранить в структуре clstruct  переменную DIR **d которая указывает на ячейку в памяти в который хранится истинный DIR* который я меняю *it->d = opendir(buf+1); на 104 строке

Добавлено через 5 минут и 58 секунд
Готов ответить на любую информацию по этому примеру  smile

Добавлено через 7 минут и 43 секунды
В использовании и понимании шаблонов, увы не силён. 

Это сообщение отредактировал(а) Ak47black - 17.10.2010, 18:51
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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