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

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

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

Студворк — интернет-сервис помощи студентам
Как можно проверить сокет,тоесть соеденение его,
вот так я проверяю
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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.04.2014, 17:02
Ответы с готовыми решениями:

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

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

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

35
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
08.04.2014, 23:25
Студворк — интернет-сервис помощи студентам
Клиент:
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  [ТС]
Убежденный, тут все нормально я посылаю просто в поток функцию без параметров это клиент,он просто читает в цикле данные бесконечном,отделил в поток что бы окно реагировала на другие действия
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
08.04.2014, 23:27
sergeu90, сейчас осталась проблема в работе ThreadPool?
0
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 23:30  [ТС]
DrOffset, проблема только и была в ThreadPool он не правильно работает если ему выставить максимальное количество потоков
C++
1
2
3
4
    
SetThreadpoolThreadMaximum(pool, max);
 
    SetThreadpoolThreadMinimum(pool, min);
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
08.04.2014, 23:46
Цитата Сообщение от sergeu90 Посмотреть сообщение
он не правильно работает если ему выставить максимальное количество потоков
Не заметил видимых проблем в работе. Выставил максимальное количество потоков 5 и запустил два клиента. Сервер увидел обоих и успешно обоих отсоединил при закрытии. В твоем коде есть проблемы, но они носят второстепенный характер. Поэтому я пока не буду заострять на них внимание.
Короче, можешь подробнее описать в чем проблема и как мне ее воспроизвести?
0
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
08.04.2014, 23:54  [ТС]
DrOffset, сделай максимальное количество поток 2 и подсоедени 4 клиента,должно что 2 клиента будут работать,а 2 буду в очереди,потом закрой клиента одного из них,подсоеденится еще один клиент который ждал и один будет еще ждать,потом отсоедени еще одного клиента и по идеи должен был заработать тот который в очереди был,но управление возвращается опять тому же который занял перед этим

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




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

Добавлено через 32 минуты
DrOffset, я думал это может так происходит из за recvв функции потока?может она что то делает не то
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.04.2014, 00:37
Лучший ответ Сообщение было отмечено 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  [ТС]
DrOffset, у меня теперь ругается на функцию SOCKET socket = *((SOCKET *)clientSocket);если поменял как вы work = CreateThreadpoolWork(ServeClient, (void*)clientSocket,&CallBackEnviron);
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.04.2014, 00:41
sergeu90, да, забыл. там тоже надо менять:
C++
1
    SOCKET socket = ((SOCKET)clientSocket);
0
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
09.04.2014, 00:45  [ТС]
DrOffset, все разобрался большое спасибо)))а насчет разделяемых ресурсов сделал через критическую секцию
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.04.2014, 00:46
sergeu90, теперь поведение какое требуется?
0
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
09.04.2014, 00:54  [ТС]
DrOffset, да))как вы дошли до этого?как вы узнали в чем именно проблема?
0
09.04.2014, 01:03

Не по теме:

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

0
28 / 29 / 5
Регистрация: 17.10.2009
Сообщений: 739
09.04.2014, 01:05  [ТС]
DrOffset, спасибо,убил два дня на это,но стоило того что бы разобраться теперь понимаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2014, 01:05

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru