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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 17:02     Проверка сокета #1
Как можно проверить сокет,тоесть соеденение его,
вот так я проверяю
C++
1
2
3
4
5
6
int Errors_sock = send(clientSocket, "s ", 0, 1);
        Errors_sock = send(clientSocket, "s ", 0, 1);
        if (Errors_sock == -1)
        {
            closesocket(clientSocket);
        }
Но тут проблема в том что сокет даже если уже на стороне клиента отсоеденен то отправление все равно проходит

Добавлено через 19 минут
подскажите варианты как можно проверять связь сокета клиента и сервера?а то я уже перепробывал почти все варианты
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2014, 17:02     Проверка сокета
Посмотрите здесь:

C++ Проверка!
проверка C++
Проверка с if C++
C++ Проверка if
C++ Проверка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6457 / 3831 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
08.04.2014, 17:33     Проверка сокета #2
Цитата Сообщение от sergeu90 Посмотреть сообщение
как можно проверять связь сокета клиента и сервера?
Keep Alive посылать например.
hint: SO_KEEPALIVE
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 17:48  [ТС]     Проверка сокета #3
DrOffset, пример можно?а то я смотрел по Kepp alive не понимаю как проверять соедедние есть или нету
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
08.04.2014, 18:00     Проверка сокета #4
Цитата Сообщение от sergeu90 Посмотреть сообщение
уже на стороне клиента отсоеденен то отправление все равно проходит
с TCP такого быть не должно, а для UDP универсального способа нет.
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 18:05  [ТС]     Проверка сокета #5
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);
вот тут что то не хочет как надо как будто работать
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
08.04.2014, 18:11     Проверка сокета #6
Забавно:
C++
1
2
  int i = 0;
    if (i == 0)
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 18:17  [ТС]     Проверка сокета #7
Tulosba,я не могу понять когда клиент отсоеденяется у меня из пула берется только все время последняя функция из пула,остальные как будто не берут управление?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
08.04.2014, 18:26     Проверка сокета #8
sergeu90, возвращаемое значение CreateThreadpoolWork на NULL проверили?
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 18:40  [ТС]     Проверка сокета #9
Tulosba, да проверял все возвращает,только почему то всегда берется последняя функция из пула,может recv как то влияет на пул потокв как то странно
могу скинуть проект клиента и сервера проверить можете

Добавлено через 1 минуту
Tulosba, получается такая ситуация,допустим я сделал пул только на 1 фунцию потока,тоесть 3 клиента подсоеденяются к серверу,только 1 клиент может в данный момент работать,потом я закрывают эту функцию и берется только 3 клиента функция которая ждала, 2 клиент уже никогда не хочет получать управление как будто исчезает и все время работает только уже 3 клиента функция

Добавлено через 8 минут
Tulosba, помогите пожалуйста разобраться очень нужно сделать,у меня курсовая горит от этого,уже 2 дня голову ломаю почему именно так происходит
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
08.04.2014, 18:46     Проверка сокета #10
sergeu90, я бы с удовольствием, но с подобными функциями работать не приходилось. Поэтому пока только очевидные вещи могу подсказать.
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 18:48  [ТС]     Проверка сокета #11
Tulosba, подскажите куда можно покопать?а то я уже бьюсь головой об стену вроде пул должен работать как я хочу,тоесть из очереди браться функции и выполняться
DrOffset
6457 / 3831 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
08.04.2014, 19:14     Проверка сокета #12
Цитата Сообщение от sergeu90 Посмотреть сообщение
пример можно?
SO_KEEPALIVE
WSAIoctl
Примерчик и пояснения есть тут.

Добавлено через 11 минут
sergeu90, мельком глянул твой код и не обнаружил там кода для ожидания (select или что-то подобное) изменения состояния. как ты отслеживаешь, что клиент уже отвалился?
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 21:05  [ТС]     Проверка сокета #13
DrOffset, я отлавливаю когда recv -1 возвращает

Добавлено через 1 минуту
DrOffset,
C++
1
2
3
4
5
6
7
8
if (bytesRecv == 0) //соединение прервано
            break;
        if (bytesRecv == SOCKET_ERROR) {
            cout << "Error recv" << WSAGetLastError() << endl;
            closesocket(socket);
            WSACleanup();
            break;
        }
Добавлено через 1 минуту
DrOffset, у меня на каждого клиента есть функция которая хранит в себе параметр сокет и когда уже recv возвращает -1 значит клиент отвалился и из пула должен достаться другой клиент этого не происходит чего то как надо

Добавлено через 34 минуты
DrOffset, вы сможете помочь или нет?

Добавлено через 1 час 14 минут
неужели никто помочь не сможет?
DrOffset
6457 / 3831 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
08.04.2014, 22:10     Проверка сокета #14
sergeu90, ну так у тебя получилось сделать как в примере?
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 22:37  [ТС]     Проверка сокета #15
DrOffset, у меня проблема с пулом а пример я тот не смотрел((((((((((((мне нужно что бы мой хотя бы тот сервер кое как заработал как надо

Добавлено через 8 минут
DrOffset, вы смотрели мой сервер?
DrOffset
6457 / 3831 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
08.04.2014, 22:51     Проверка сокета #16
sergeu90, скинь вложением проект. У тебя VS?
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 23:02  [ТС]     Проверка сокета #17
DrOffset, да vs 2013 только
DrOffset
6457 / 3831 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
08.04.2014, 23:08     Проверка сокета #18
sergeu90, ну брось в личку проекты сервера и клиента целиком. посмотрю.
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 23:09  [ТС]     Проверка сокета #19
Client.rar

Server.rar
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2014, 23:10     Проверка сокета
Еще ссылки по теме:

C++ Проверка строки
C++ Считать данные с сокета в массив
С++ проверка C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 23:10  [ТС]     Проверка сокета #20
DrOffset, скинул в топик
Yandex
Объявления
08.04.2014, 23:10     Проверка сокета
Ответ Создать тему
Опции темы

Текущее время: 00:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru