Форум программистов, компьютерный форум CyberForum.ru

Многопоточный чат с использованием пула потоков - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как передать массив в функцию так, чтобы при выходе из функции он не изменялся? http://www.cyberforum.ru/cpp-beginners/thread1127598.html
Задачка: есть строка, которая состоит из символов. Символы соединяються в слова, которые оттделены друг от друга одним или несколькими пробелами. В конце текста крапка. написать: 1) Функцию, которая выводит все слова, без гласных литер; 2) Ф-кцию, которая выводит все слова без цыфр. Задачку сделал и по-отдельно функции работают. Но когда запускаю функции друг за другом, то первая работает...
C++ При вызове конструктора ошибка: L "Buffer is too small" & & 0 Привет. При вызове конструктора вылетает эта ошибка. Student(char *n, char *s, char *p, int y, char *g) { name = new char; surname = new char; patr = new char; group = new char; http://www.cyberforum.ru/cpp-beginners/thread1127581.html
C++ Переделайте, пожалуйста, с использованием процедур. Код С++
#include <iostream> #include <time.h> #define SIZE_X 10 #define SIZE_Y 12 #define MAX_NUM 256 int main() {
Удалить из массива числа – палиндромы, в которых есть хотя бы одна нечетная цифра C++
помогите написать программу на С++ Дан массив из N целых чисел, где N<=16, каждое число в диапазоне от –32000 до 32000. Создать программу с обязательным использованием функций. Вместо чисел, имеющих в составе цифру P, вставить сумму цифр этого числа.
C++ Получение доступа к переменным класса из другого класса http://www.cyberforum.ru/cpp-beginners/thread1127575.html
Как передать по ссылке переменную из класса А в метод класса В?
C++ Найти строку в массиве без положительных элементов Доброго времени суток! Есть задачка. Для двумерного массива разработайте код который бы находил последнюю строчку в массиве не содержащюю не одного положительного элемента. Большую половину задачи я решил помогите плиз добить ее до конца!!! #include <iostream> #include <math.h> #include <Windows.h> using namespace std; подробнее

Показать сообщение отдельно
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.03.2014, 13:50     Многопоточный чат с использованием пула потоков
вот пример с 1 потоком на accept подключений, и множеством потоков на каждое сообщение (по сути можно на каждое сообщение не поток создавать, а отдавать ф-цию которая производит чтение в пул)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
class ClassMaster
{
    typedef std::set<SOCKET> ClientList_t;
    typedef std::map<SOCKET, boost::thread*> HandlerProcessThread_t;
public:
    void Dispatch(bool &bWork)
    {
        
        while(bWork)
        {
            //std::cout<<"dispatch" <<std::endl;
            if(!_Clients.empty())
            {
                //std::cout<<"Clients not empty" << std::endl;
                fd_set ReadSet;
                fd_set WriteSet;
                fd_set ExceptSet;
                FD_ZERO(&ReadSet);
                FD_ZERO(&WriteSet);
                FD_ZERO(&ExceptSet);
                ClientList_t::iterator Iter = _Clients.begin();
                for(int i = 0; Iter != _Clients.end() && i < FD_SETSIZE; ++Iter, ++i)
                {
                    ReadSet.fd_array[i] = *Iter;
                }
                ReadSet.fd_count = _Clients.size();
                memcpy(&ExceptSet, &ReadSet, sizeof(fd_set));
                ClientList_t::iterator MaxFdIter = --_Clients.end();
                timeval tm;
                tm.tv_usec = 10;
                tm.tv_sec = 0;
                int Fds = select(*MaxFdIter + 1, &ReadSet, &WriteSet, &ExceptSet, &tm);
                if(Fds == -1)
                {
                    std::cout<<"Select error: " << h_errno << std::endl;
                }
                //std::cout<<"Fds = " << Fds << std::endl;
                for(unsigned int i = 0; i < ReadSet.fd_count; i++)
                {
                    SOCKET sock = ReadSet.fd_array[i];
                    //std::cout<<"Read ready socket" << sock << std::endl;
                    ProcessRead(sock);
                }
                while(!_ClosedSocket.empty())
                {
                    Disconnect(_ClosedSocket.front());
                    _ClosedSocket.erase(_ClosedSocket.begin());
                }
 
            }
            //boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
        }
        
    }
    void AddClient(const SOCKET & sock)
    {
        _Clients.insert(sock);
        boost::thread * New = new boost::thread(&ClassMaster::ProcessWrite, boost::ref(*this), sock);
        _Threads.insert(std::make_pair(sock, New));
        //std::
    }
    void DeleteClient(const SOCKET & sock)
    {
        ClientList_t::iterator Iter = _Clients.begin();
        for(; Iter != _Clients.end(); ++Iter)
        {
            if(*Iter == sock)
            {
                _Clients.erase(Iter);
                break;
            }
        }
        if(_Threads.find(sock) != _Threads.end())
        {
            if(_Threads[sock]->joinable())
            {
                _Threads[sock]->detach();
            }
 
            delete _Threads[sock];
            _Threads.erase(sock);
        }
    }
    void ProcessRead(SOCKET sock)
    {
        char msg[1024];
        int n = 0;
        n = recv(sock, msg, 1024,0);
        
 
        int SockError = 0;
        int Len = sizeof(SockError);
        if(n <= 0)
        {
            Disconnect(sock);
        }
        else
        {
            std::cout<< "Remote said: ";
            for(int i = 0; i < n; i ++)
            {
                std::cout<< msg[i]<<"";
            }
            std::cout << std::endl;
        }
    }
    void ProcessWrite(SOCKET sock)
    {
        char msg[1024];
        std::string mes;
        while(1)
        {
            getline(std::cin,mes);
            if(mes == "q")
            {
                break;
            }
            int n = 0;
            n = send(sock, mes.c_str(), mes.length(),0);
        }
        _ClosedSocket.push_back(sock);
    }
    void Disconnect(const SOCKET &sock)
    {
        DeleteClient(sock);
        closesocket(sock);
        std::cout << "Client has disconnected." << std::endl;
    }
private:
    ClientList_t _Clients;
    HandlerProcessThread_t _Threads;
    std::list<SOCKET> _ClosedSocket;
};
 
SOCKET CreateServerSocket(SOCKET & ServerSocket)
{
    ServerSocket = socket(AF_INET, SOCK_STREAM, 0);
    if(ServerSocket == INVALID_SOCKET)
    {
        std::cout << "Error of creating socket: code " << h_errno << std::endl;
        return false;
    }
    sockaddr_in ServerAddress;
    memset(&ServerAddress,0,sizeof(ServerAddress));
    ServerAddress.sin_family = AF_INET;
    //ServerAddress.sin_addr.s_addr=INADDR_ANY;
    /*ServerAddress.sin_addr.S_un.S_un_b.s_b1 = 192;
    ServerAddress.sin_addr.S_un.S_un_b.s_b2 = 168;
    ServerAddress.sin_addr.S_un.S_un_b.s_b3 = 133;
    ServerAddress.sin_addr.S_un.S_un_b.s_b4 = 85;*/
    ServerAddress.sin_addr.s_addr = inet_addr("192.168.133.85");
    ServerAddress.sin_port=htons(17000);
    if(bind(ServerSocket, (sockaddr *)&ServerAddress,sizeof(ServerAddress)))
    {
        std::cout << "Error of binding socket: code " << h_errno << std::endl;
        return false;
    }
    if(listen(ServerSocket, 10))
    {
        std::cout << "Error of going listened socket: code " << h_errno << std::endl;
        return false;
    }
    return true;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    WSAData WsaData;
    WSAStartup(MAKEWORD(2,0),&WsaData);
    SOCKET ServerSocket = 0;
    if(!CreateServerSocket(ServerSocket))
    {
        system("pause");
        return 0;
    }
    sockaddr_in ClientAddress;
    int ClientAddressSize = sizeof(ClientAddress);
    memset(&ClientAddress,0,sizeof(ClientAddress));
    SOCKET ClientSocket;
    ClassMaster Master;
    bool bWork = true;
    boost::thread ThreadDispatcher(&ClassMaster::Dispatch, boost::ref(Master), boost::ref(bWork));
    while(1)
    {
        ClientSocket = accept(ServerSocket, (sockaddr*)&ClientAddress, &ClientAddressSize);
        if(ClientSocket == INVALID_SOCKET)
        {
            std::cout << "Error of accept socket: code " << h_errno << std::endl;
        }
        std::cout<<"Has connection!"<<std::endl;
        std::cout<<"Client: " << (int)ClientAddress.sin_addr.S_un.S_un_b.s_b1 <<"." << 
            (int)ClientAddress.sin_addr.S_un.S_un_b.s_b2 << "." << (int)ClientAddress.sin_addr.S_un.S_un_b.s_b3 << "." <<
            (int)ClientAddress.sin_addr.S_un.S_un_b.s_b4 << ":" << ClientAddress.sin_port <<std::endl;
        Master.AddClient(ClientSocket);
    }
    /*boost::thread tr(Func);
    boost::this_thread::sleep_for(boost::chrono::milliseconds(3000));
    tr.interrupt();
    */
    bWork = false;
    ThreadDispatcher.join();
    system("pause");
    return 0;
}
Добавлено через 1 минуту
ф-ция Dispatch() в цикле Вызывает select + доп. действия

Добавлено через 49 секунд
Цитата Сообщение от aLarman Посмотреть сообщение
и множеством потоков на каждое сообщение
усп ошибся, тут поток на 1 клиента
 
Текущее время: 04:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru