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

Поиск:

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


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


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

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



Цитата(Ak47black @  17.10.2010,  17:47 Найти цитируемый пост)
Да вот незнаю, как более яснее преподнести

не преподносить того, что отвлекает внимание от проблемы.. 
надо не весь код предлагать (хотя его можно тоже альтернативно), а локализованную часть с проблемой .. 
лично мне первые после пролистывания 24 строчек с инклудами, остальной код смотреть отпадает желание... 
неужели нельзя оформить так, чтоб читающим было приятно Вам помочь ?!



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


Опытный
**


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

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



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

#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;
};

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

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;
}

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


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


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

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



Цитата(Ak47black @  17.10.2010,  17:47 Найти цитируемый пост)
из ошибок видно что проблема на строке
Код

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

и
Код

clients.insert(temp);


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

вот это уже другое дело.. только еще не надо забывать о структуре
Код

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



Это сообщение отредактировал(а) mes - 17.10.2010, 19:15


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


Эксперт
****


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

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



...

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


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


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

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



структура как видно не соответсвует требованиям для хранения в упорядоченных контейнерах.. 

Цитата(Crafty @  17.10.2010,  18:00 Найти цитируемый пост)
шибка в том что нету оператора меньше для структуры

 smile 


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


Эксперт
****


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

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



Сейчас испытываю этого зверя .....  smile 
PM MAIL   Вверх
mes
Дата 17.10.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Ak47black, 
1. если пользуйте C++ не используйте exit()
2. структура clstruct не вписывается в стиль вашего кода..

Добавлено через 54 секунды
да и вобще так мешать С и С++ к ничему хорошему не приведет.. 



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


Эксперт
****


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

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



Цитата(mes @  17.10.2010,  19:22 Найти цитируемый пост)
да и вобще так мешать С и С++ к ничему хорошему не приведет..

Я если честно даже незнал что я их смешиваю.
PM MAIL   Вверх
Ak47black
Дата 17.10.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну всё проверил, работает!  smile 
Вот такой код вышел
Код

#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;
};
bool operator<(const clstruct &lhs, const clstruct &rhs)
{
    return lhs.sock < rhs.sock;
}
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(1101);
    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 = 150;
        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);
                buf[bytes_read] = '\0';
                if(bytes_read <= 0)
                {
                    // Соединение разорвано, удаляем сокет из множества
                    close(it->sock);
                    free(it->d);
                    clients.erase(*it);
                    continue;
                }
                //printf("got %s\n", buf+1);
                if (buf[0] == 1)
                {
                    *it->d = opendir(buf+1);
                }
                if ((buf[0] == 2)||(buf[0] == 1))
                {
                    de = readdir(*it->d);

                    if (de != NULL)
                    {
                        buf[0] = 2;
                        memcpy(buf+1, de->d_name, strlen(de->d_name));
                        //printf("%s %d\n", buf+1, strlen(buf+1)+1);
                        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;
}

Рад что я наконецто запустил это дело  smile 
Осталось подвести этог
Суть я понял из поста из 17 который написал Crafty, за что я выражаю особую благодарность.
Так-же этот код я в первый раз вижу у 586, но только не смог его сразу понять.

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



2 вопроса/замечания:
  •  Зачем делать из set велосипедный map? (map<int,DIR**>)
  •  Конструкция max_element(clients.begin(), clients.end()) почти полностью эквивалентна clients.rbegin() (почти в смысле - делает то же самое, но гораздо медленнее)

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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