Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/55: Рейтинг темы: голосов - 55, средняя оценка - 4.62
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
1

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

08.04.2014, 17:02. Показов 11070. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как можно проверить сокет,тоесть соеденение его,
вот так я проверяю
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 минут
подскажите варианты как можно проверять связь сокета клиента и сервера?а то я уже перепробывал почти все варианты
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2014, 17:02
Ответы с готовыми решениями:

Считать данные с сокета в массив
Почему данные с сокета в массив не попадают?? Где ошибка? #include <WinSock2.h> #include...

Создание сокета по адресу 192.168
Здравствуйте! У меня такой вопрос: почему, когда я в 36-ой строчке кода указываю локальный IP-адрес...

Чтение сокета в одном потоке, обработка в другом
Приветствую всех. В C/C++ новичок, прошу помощи. Имеются наброски приложения Linux, которое, на...

Winsock. Почему в приведенном коде не работает создание сокета?
Добрый день! Пробую освоить сетевое программирование под винду. Планируется клиентское приложение,...

35
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
08.04.2014, 23:25 21
Author24 — интернет-сервис помощи студентам
Клиент:
C++
1
2
3
4
5
// ...
 
//Посылаем в поток 
DWORD threadID;
CreateThread(NULL, NULL, Recv_Message, NULL, NULL, &threadID);
А что именно отсылается в поток ? Туда же NULL-указатель передается, а
должен, видимо, дескриптор сокета...
0
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 23:27  [ТС] 22
Убежденный, тут все нормально я посылаю просто в поток функцию без параметров это клиент,он просто читает в цикле данные бесконечном,отделил в поток что бы окно реагировала на другие действия
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
08.04.2014, 23:27 23
sergeu90, сейчас осталась проблема в работе ThreadPool?
0
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 23:30  [ТС] 24
DrOffset, проблема только и была в ThreadPool он не правильно работает если ему выставить максимальное количество потоков
C++
1
2
3
4
    
SetThreadpoolThreadMaximum(pool, max);
 
    SetThreadpoolThreadMinimum(pool, min);
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
08.04.2014, 23:46 25
Цитата Сообщение от sergeu90 Посмотреть сообщение
он не правильно работает если ему выставить максимальное количество потоков
Не заметил видимых проблем в работе. Выставил максимальное количество потоков 5 и запустил два клиента. Сервер увидел обоих и успешно обоих отсоединил при закрытии. В твоем коде есть проблемы, но они носят второстепенный характер. Поэтому я пока не буду заострять на них внимание.
Короче, можешь подробнее описать в чем проблема и как мне ее воспроизвести?
0
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 23:54  [ТС] 26
DrOffset, сделай максимальное количество поток 2 и подсоедени 4 клиента,должно что 2 клиента будут работать,а 2 буду в очереди,потом закрой клиента одного из них,подсоеденится еще один клиент который ждал и один будет еще ждать,потом отсоедени еще одного клиента и по идеи должен был заработать тот который в очереди был,но управление возвращается опять тому же который занял перед этим

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


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


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

Добавлено через 32 минуты
DrOffset, я думал это может так происходит из за recvв функции потока?может она что то делает не то
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
09.04.2014, 00:37 29
Лучший ответ Сообщение было отмечено sergeu90 как решение

Решение

sergeu90, в общем все понятно, разобрался в чем дело.
Ты зря отдаешь по адресу сокет в поток, нужно копировать. Это на время получается разделяемый ресурс, который перезатирается на очередной итерации подключения и поток цепляется к уже существующему соединению. Я сделал вот так и все заработало.
C++
1
work = CreateThreadpoolWork(ServeClient, (void*)clientSocket,&CallBackEnviron);
Однако у тебя там еще проблемы, серьезные. У тебя есть две переменные, которые являются разделяемыми между потоками.
C++
1
2
int usersCount = 0; // количество активных пользователей
SOCKET usersList[MAX_CLIENTS]; // массив для списка сокетов подключенных клиентов
Доступ к ним нужно синхронизировать. Через мьютекс, например.

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

Не по теме:

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

0
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
09.04.2014, 01:05  [ТС] 36
DrOffset, спасибо,убил два дня на это,но стоило того что бы разобраться теперь понимаю
0
09.04.2014, 01:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2014, 01:05
Помогаю со студенческими работами здесь

Проверка сокета на коннект
есть серверный сокет, хочется сделать таймер и каждые ну скажем 300мс проверять на наличие коннекта...

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

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

Копирование сокета или передача сокета в функцию
Добрый день всем, столкнулся с тем что не могу скопировать сокет. boost::asio::ip::tcp::socket...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru