Форум программистов, компьютерный форум 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++ Проверка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14199 / 6214 / 986
Регистрация: 02.05.2013
Сообщений: 10,356
Завершенные тесты: 1
08.04.2014, 23:25     Проверка сокета #21
Клиент:
C++
1
2
3
4
5
// ...
 
//Посылаем в поток 
DWORD threadID;
CreateThread(NULL, NULL, Recv_Message, NULL, NULL, &threadID);
А что именно отсылается в поток ? Туда же NULL-указатель передается, а
должен, видимо, дескриптор сокета...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 23:27  [ТС]     Проверка сокета #22
Убежденный, тут все нормально я посылаю просто в поток функцию без параметров это клиент,он просто читает в цикле данные бесконечном,отделил в поток что бы окно реагировала на другие действия
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
08.04.2014, 23:27     Проверка сокета #23
sergeu90, сейчас осталась проблема в работе ThreadPool?
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 23:30  [ТС]     Проверка сокета #24
DrOffset, проблема только и была в ThreadPool он не правильно работает если ему выставить максимальное количество потоков
C++
1
2
3
4
    
SetThreadpoolThreadMaximum(pool, max);
 
    SetThreadpoolThreadMinimum(pool, min);
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
08.04.2014, 23:46     Проверка сокета #25
Цитата Сообщение от sergeu90 Посмотреть сообщение
он не правильно работает если ему выставить максимальное количество потоков
Не заметил видимых проблем в работе. Выставил максимальное количество потоков 5 и запустил два клиента. Сервер увидел обоих и успешно обоих отсоединил при закрытии. В твоем коде есть проблемы, но они носят второстепенный характер. Поэтому я пока не буду заострять на них внимание.
Короче, можешь подробнее описать в чем проблема и как мне ее воспроизвести?
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 23:54  [ТС]     Проверка сокета #26
DrOffset, сделай максимальное количество поток 2 и подсоедени 4 клиента,должно что 2 клиента будут работать,а 2 буду в очереди,потом закрой клиента одного из них,подсоеденится еще один клиент который ждал и один будет еще ждать,потом отсоедени еще одного клиента и по идеи должен был заработать тот который в очереди был,но управление возвращается опять тому же который занял перед этим

Добавлено через 1 минуту
DrOffset, тоесть как будто в очереди который был он не занинимает потом поток,а должен был ща приведу скриншот как работает
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
09.04.2014, 00:01  [ТС]     Проверка сокета #27
Проверка сокета

Проверка сокета

Проверка сокетаDrOffset,
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
09.04.2014, 00:35  [ТС]     Проверка сокета #28
первая картинка 4 клиента,2 из них работают 2 ожидают,
вторая картинка завершил 1 клиента другой получил свой поток и уже может работать
третия картинка завершил еще 1 клиента а тот который должен был заработать не заработал,а вернуло сообщение опять тому который на 2 картинке получил управление,тоесть тот из очереди как будто ушел куда то

Добавлено через 32 минуты
DrOffset, я думал это может так происходит из за recvв функции потока?может она что то делает не то
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
09.04.2014, 00:37     Проверка сокета #29
Сообщение было отмечено автором темы, экспертом или модератором как ответ
sergeu90, в общем все понятно, разобрался в чем дело.
Ты зря отдаешь по адресу сокет в поток, нужно копировать. Это на время получается разделяемый ресурс, который перезатирается на очередной итерации подключения и поток цепляется к уже существующему соединению. Я сделал вот так и все заработало.
C++
1
work = CreateThreadpoolWork(ServeClient, (void*)clientSocket,&CallBackEnviron);
Однако у тебя там еще проблемы, серьезные. У тебя есть две переменные, которые являются разделяемыми между потоками.
C++
1
2
int usersCount = 0; // количество активных пользователей
SOCKET usersList[MAX_CLIENTS]; // массив для списка сокетов подключенных клиентов
Доступ к ним нужно синхронизировать. Через мьютекс, например.

По хорошему это надо переделать через очередь событий и синхронизировать только ее. Тогда и сокет для работы можно через событие передать и данные другие. Поток начала работу, достал из очереди событие и начал его обрабатывать. В список клиентов добавлять в основном потоке, удалять тоже. Добавлять при старте обработки, удалять по завершению. Как-то так.
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
09.04.2014, 00:40  [ТС]     Проверка сокета #30
DrOffset, у меня теперь ругается на функцию SOCKET socket = *((SOCKET *)clientSocket);если поменял как вы work = CreateThreadpoolWork(ServeClient, (void*)clientSocket,&CallBackEnviron);
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
09.04.2014, 00:41     Проверка сокета #31
sergeu90, да, забыл. там тоже надо менять:
C++
1
    SOCKET socket = ((SOCKET)clientSocket);
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
09.04.2014, 00:45  [ТС]     Проверка сокета #32
DrOffset, все разобрался большое спасибо)))а насчет разделяемых ресурсов сделал через критическую секцию
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
09.04.2014, 00:46     Проверка сокета #33
sergeu90, теперь поведение какое требуется?
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
09.04.2014, 00:54  [ТС]     Проверка сокета #34
DrOffset, да))как вы дошли до этого?как вы узнали в чем именно проблема?
DrOffset
09.04.2014, 01:03
  #35

Не по теме:

sergeu90, просто исправлял все потенциально опасные места Добавил синхронизацию, проверки ошибок после вызовов, ну и это тоже на глаза попалось. Оно на поверхности на самом деле. Т.е. невооруженным глазом понятно, что так делать нельзя. Осталось только удостовериться, что причина именно озвученной проблемы была в этом. Пара прогонов для проверки и сюда пост написал.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2014, 01:05     Проверка сокета
Еще ссылки по теме:

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

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

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

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