Форум программистов, компьютерный форум, киберфорум
Наши страницы

Проверка сокета - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Составить программу, в которой вычислить, где и - сумма и количество положительных элементов массива Х [N]; и - сумма и http://www.cyberforum.ru/cpp-beginners/thread1142542.html
Составить программу, в которой вычислить z=s1+s2/k1*k2 , где s1,k1 и - сумма и количество положительных элементов массива Х ; и s2, k2- сумма и количество положительных элементов массива Y ....
C++ Удаление из файла Помогите с Удалением из файла. Например: Я записал 2 животных, как удалить 1 из животных из файла? Вот мой код. Помогите дописать удаление. Код: #include<iostream> #include<fstream> using... http://www.cyberforum.ru/cpp-beginners/thread1142535.html
C++ Поиск товара
Здравствуйте! Сделал поиск, но почему то не выводит найденное, когда водиш по какому параметру искать и что искать, программа тормозит и все, это не связано с процедурой подключенной для вывода вот...
C++ Поиск товара
Здравствуйте! Сделал процедур на поиск товара, поиск осуществляется по 2 параметрам, при выборе формата все ок, но потом когда водиш что искать и жмеш ентер, ничего дальше не происходит вот код...
C++ Вычисление интеграла методом прямоугольников http://www.cyberforum.ru/cpp-beginners/thread1142515.html
Добрый день. Написал прогру считающую интеграл методом прямоугольников, но выдаёт какие-то странные значения. Подскажите что не так. Заранее спасибо. #include<stdio.h> #include<math.h>...
C++ Убрать из файла все буквы 'а'. Символьный файл содержит различные буквы латинского алфавита. Убрать из этого файла все буквы 'а'. подробнее

Показать сообщение отдельно
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 18:05  [ТС]
Tulosba, изначально я хотел сделать костыль потому что мой пул потоков неправильно чего то берет из очереди функции которые в нем находятся можете глянуть почему так происходит вот код сервера
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
#include "Winsock2.h"
#include <Windows.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>
#include <string>
#include <sys/types.h>
 
#define MAX_CLIENTS 64
#define SIZE_MESSAGE 120
#define ANSWER_SERVER "Клиент успешно подключен"
#define QUEUE "Ожидайте подключение к серверу вы в очереди"
 
int usersCount = 0; // количество активных пользователей
 
SOCKET usersList[MAX_CLIENTS]; // массив для списка сокетов подключенных клиентов
 
HOSTENT *host;
 
sockaddr_in clientAddrr; // адрес клиента (заполняется системой)
 
using namespace std;
 
#pragma comment(lib,"WS2_32.lib")
 
 
PTP_POOL pool = NULL;
 
TP_CALLBACK_ENVIRON CallBackEnviron;
 
PTP_CLEANUP_GROUP cleanupgroup = NULL;
PTP_WORK work;
 
//Количество пользователей на сервере
void PrintUsers() {
    if (usersCount != 0)
        cout << usersCount << " user online" << endl;
    else
        cout << "No users online" << endl;
}
/*Функция которая работает с каждым клиентом на сервере*/
VOID CALLBACK ServeClient(PTP_CALLBACK_INSTANCE Instance, PVOID clientSocket, PTP_WORK Work)
{
 
    SOCKET socket = *((SOCKET *)clientSocket);
 
    for (int i = 0; i < MAX_CLIENTS; i++)
    {
        if (usersList[i] == INVALID_SOCKET)
        {
            usersList[i] = socket;
            usersCount++;
            break;
        }
    }
    char buffer[SIZE_MESSAGE];
 
    int i = 0;
    if (i == 0)
        send(socket, ANSWER_SERVER, sizeof(ANSWER_SERVER), 0);
    i++;
 
    while (int bytesRecv = recv(socket, buffer, sizeof(buffer), 0))
    {
        if (bytesRecv == 0) //соединение прервано
            break;
        if (bytesRecv == SOCKET_ERROR) {
            cout << "Error recv" << WSAGetLastError() << endl;
            closesocket(socket);
            WSACleanup();
            break;
        }
        if (bytesRecv > 0) {
            //buffer[bytesRecv - 1] = '\0';
            for (int i = 0; i < MAX_CLIENTS; i++)
            {
                if (usersList[i] != INVALID_SOCKET)
                    send(usersList[i], buffer, bytesRecv, 0);
            }
        }
    }
    for (int i = 0; i < MAX_CLIENTS; i++)
    {
        if (usersList[i] == socket)
        {
            usersList[i] = INVALID_SOCKET;
            usersCount--;
            cout << "client disconnected" << endl;
            PrintUsers();
            shutdown(socket, SD_BOTH);
            closesocket(socket);
        }
    }
 
 
 
}
 
//Функция для создание пула потоков 
void Create_ThreadPool(int min, int max)
{
 
    InitializeThreadpoolEnvironment(&CallBackEnviron);
 
    pool = CreateThreadpool(NULL);
 
    SetThreadpoolThreadMaximum(pool, max);
 
    SetThreadpoolThreadMinimum(pool, min);
 
    cleanupgroup = CreateThreadpoolCleanupGroup();
 
    SetThreadpoolCallbackPool(&CallBackEnviron, pool);
 
    SetThreadpoolCallbackCleanupGroup(&CallBackEnviron, cleanupgroup, NULL);
 
}
int main(void)
{
    Create_ThreadPool(1, 2);
 
    setlocale(LC_ALL, "Russian");
 
    for (int i = 0; i < MAX_CLIENTS; i++)
        usersList[i] = INVALID_SOCKET;
 
    WSADATA wsadata;
    struct sockaddr_in local;
    SOCKET servSocket;
    SOCKET clientSocket;
    int rc;
    char buf[100];
    memset(buf, 0, sizeof(buf));
    WSAStartup(MAKEWORD(2, 2), &wsadata);//Инициализация сокета Winsock
    local.sin_family = AF_INET;
    local.sin_port = htons(7500);
    local.sin_addr.s_addr = htonl(INADDR_ANY);
 
    servSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (servSocket < 0)
    {
        cout << "Ошибка вызова сокета" << endl;
        WSACleanup();
        exit(1);
    }
 
    rc = bind(servSocket, (struct sockaddr *)&local, sizeof(local));
    if (rc < 0)
    {
        cout << "Ошибка вызова bind" << endl;
        WSACleanup();
        exit(1);
    }
 
    rc = listen(servSocket, 10);
    if (rc)
    {
        cout << "Ошибка вызова listen" << endl;
        WSACleanup();
        exit(1);
    }
    cout << "Ожидание подключения  пользователей" << endl;
 
    //Извлекаем сообщение из очереди
    int clientAddrSize = sizeof(clientAddrr);
 
    int count = 0;
    while ((clientSocket = accept(servSocket, (sockaddr *)&clientAddrr, &clientAddrSize)))
    {
            /*int addrLen = sizeof(sockaddr);
            struct sockaddr_in CliAddr;
            getsockname(clientSocket,(LPSOCKADDR)&CliAddr,&addrLen);
            string CliIP = (string)inet_ntoa(CliAddr.sin_addr);
            */
        if (clientSocket != INVALID_SOCKET)
        {
 
            host = gethostbyaddr((char*)&clientAddrr.sin_addr.s_addr, 4, AF_INET);// пытаемся получить имя хоста
            cout << host->h_name << " (" << inet_ntoa(clientAddrr.sin_addr) << " ) has connected" << endl;
 
            //PrintUsers();
 
            send(clientSocket, QUEUE, sizeof(QUEUE), 0);
            //Тут я отдахю функцию в пул потоков который настроен пока что на 2 потока,остальные потоки должны ждать своего очереди
            work = CreateThreadpoolWork(ServeClient, &clientSocket, &CallBackEnviron);
            SubmitThreadpoolWork(work);
        }
        }
    
    return 0;
}
Добавлено через 35 секунд
Tulosba,
C++
1
2
work = CreateThreadpoolWork(ServeClient, &clientSocket, &CallBackEnviron);
            SubmitThreadpoolWork(work);
вот тут что то не хочет как надо как будто работать
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru