Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750

Что такое дескриптор сокета?

05.02.2019, 12:37. Показов 8301. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дескриптор сокета - это целочисленное значение. Например:
C++
1
client_socket = accept(listen_socket, (struct sockaddr *) &client_addr, &client_addrsize);
Но что скрывается за этим числом?

Вопрос 1:
Как узнать параметры клиента, с которым установлено соединение (accept) по значению дескриптора listen_socket?
Ведь не только по ай-пи адресу отправляется ответ сервера. Где-то же хранится информация, например, о том, с какой вкладки какого браузера и с какой учетной записи отправлен запрос...

Вопрос 2:
У меня часто, при закрытии одного соединения и создании нового, значение дескриптора не меняется. То есть, в цикле несколько раз подряд может присваиваться одно и то же числовое значение client_socket для запросов разных клиентов.
Это нормально?
Вот примерный код:
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
int client_socket;//дескриптор сокета
string response;//содержание ответа сервера
    while (true)
    {
        client_socket = -1;
        result = -1;
        client_socket = accept(listen_socket, (struct sockaddr *) &client_addr, &client_addrsize);
 
        cout << client_socket << endl; //часто выводит одинаковые значения для разных запросов
 
        if (client_socket > 0)
        {
                        result = recv(client_socket, buf, max_client_buffer_size, 0);
            if (result > 0)
            {
            ///// ЗДЕСЬ ОБРАБОТКА ЗАПРОСА в дочернем процессе//////
            response=.....................................................
        
            result = send(client_socket, response.c_str(), response.length(), 0);//ответ сервера
            u_long iMode = 1;
            result = ioctlsocket(listen_socket, FIONBIO, &iMode);//включаем режим неблокированного ожидания запроса клиента
            }
            closesocket(client_socket);
    }
Вопрос 3:
Возможна ли такая ситуация?:
- дочерний процесс получает дескриптор и обрабтывает результат запроса
- пока результаты обрабатываются, приходит запрос от другого клиента с тем же номером дескриптора
- по окончании обработки результатов запроса, дочерний процесс возвращает результат родительскому процессу
- ответ сервера направляется не тому клиенту от которого получен запроос, поскольку теперь другой клиент имеет дескриптор сокета с тем же номером, что и первый.

P.S.
У меня клиенты получают иногда ответы не на свои запросы (при возврате на прежние страницы в браузере и прочее). Не могу понять почему. Или я с куками запутался или из-за дескрипторов всё...
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.02.2019, 12:37
Ответы с готовыми решениями:

Что такое дескриптор ?
Подскажите пожалуйста что представляет из себя дескриптор ??? Не могу разобраться ? в понятии это подразумеваеться какое то значение или...

Что такое дескриптор в архитектуре ПК?
Добрый вечер! В Диспетчере задач отображается количество дескрипторов. Не напомните, что это такое? Спасибо.

Что такое базовый дескриптор элемента управления?
базовый дескриптор управления, что это? уникальный ID контрола?или код экземпляра контрола? обьясните пожалоуйста простым языкаом а не...

9
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
06.02.2019, 08:45
Лучший ответ Сообщение было отмечено LVV как решение

Решение

Цитата Сообщение от LVV Посмотреть сообщение
Но что скрывается за этим числом?
Это просто индекс массива, позволяющий ОС добраться до указателя на нужную структуру данных.
Цитата Сообщение от LVV Посмотреть сообщение
Как узнать параметры клиента, с которым установлено соединение (accept) по значению дескриптора listen_socket?
Какие именно параметры?
Цитата Сообщение от LVV Посмотреть сообщение
Ведь не только по ай-пи адресу отправляется ответ сервера. Где-то же хранится информация, например, о том, с какой вкладки какого браузера и с какой учетной записи отправлен запрос...
SOCK_STREAM (TCP) для идентификации соединений использует пару свой_ip:свой_порт=>удаленный_ip:порт. О вкладках, учетных записях и прочем сервер ничего не знает. У вас же HTTP и если вам нужно сообщить что-то серверу, вы должны использовать параметры запроса.
Цитата Сообщение от LVV Посмотреть сообщение
Вопрос 2:
У меня часто, при закрытии одного соединения и создании нового, значение дескриптора не меняется. То есть, в цикле несколько раз подряд может присваиваться одно и то же числовое значение client_socket для запросов разных клиентов.
Это нормально?
Вот примерный код:
Да нормально, более того, если в приведенном коде они иногда они не совпадают, то у вас утечка (где-то забываете закрывать файловый дескриптор).
Цитата Сообщение от LVV Посмотреть сообщение
Возможна ли такая ситуация?:
- дочерний процесс получает дескриптор и обрабтывает результат запроса
- пока результаты обрабатываются, приходит запрос от другого клиента с тем же номером дескриптора
- по окончании обработки результатов запроса, дочерний процесс возвращает результат родительскому процессу
- ответ сервера направляется не тому клиенту от которого получен запроос, поскольку теперь другой клиент имеет дескриптор сокета с тем же номером, что и первый.
Пункт 2, не возможен пока вы не закрыли уже существующий дескриптор, другое дело, что вы могли "потерять" старый и отправить ответ "не тому" сами. Впрочем код показанный выше, не принимает новых соединений пока не будет закончена обработка предыдущего.

PS: зачем вам FIONBIO в таком виде и в таком месте???
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
06.02.2019, 09:54  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
зачем вам FIONBIO в таком виде и в таком месте?
Без этих строк
C++
1
2
u_long iMode = 1;
            result = ioctlsocket(listen_socket, FIONBIO, &iMode);
у меня сервер висел до тех пор, пока не получит запрос от клиента (остальные клиенты вынуждены были ждать), или пока сокет не закрывался сам (до нескольких десятков секунд) по причине отсутствия запроса.
Когда добавил эти строки (насколько я понимаю, этим я блокирующее ожидание заменил на неблокирующее, когда при отсутствии запроса сокет сразу же закрывался) проблема зависаний исчезла.

Вот только проблема отправки ответов не тем клиентам осталась...
Спасибо, prik, за ответ.

Ну а насчет FIONBIO... не знаю. Нашел пример в Инете... и просто воспользовался.
Буду разбираться.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
06.02.2019, 09:58
Цитата Сообщение от LVV Посмотреть сообщение
Нашел пример в Инете...
Может лучше книгу Р. Стивенса почитать?
1
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
06.02.2019, 13:36
Цитата Сообщение от LVV Посмотреть сообщение
у меня сервер висел до тех пор, пока не получит запрос от клиента (остальные клиенты вынуждены были ждать),
В коде который вы показываете, без FIONBIO сервер будет спать в accept() или обрабатывать запрос одного клиента (остальные клиенты если таковые есть, ждут в очереди listen-сокета). С FIONBIO он будет жрать процессор при отсутствии клиентов и точно также обрабатывать запрос от одного клиента. Т.е. в таком виде это не решение какой-то проблемы, а вред.
Выше назвали хорошую книжку. Почитайте не обращая внимание на слово unix и связанные с ним особенности.
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
07.02.2019, 06:01  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Может лучше книгу Р. Стивенса почитать?
Цитата Сообщение от prik Посмотреть сообщение
Выше назвали хорошую книжку. Почитайте
Но, это же не книжка, а автор... И вероятно, у него много хороших книг. С какой лучше начать, уитывая вышеизложенные проблемы?
Протоколы TCP/IP. Практическое руководство?
UNIX. Разработка сетевых приложений?
UNIX Профессиональное программирование?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.02.2019, 08:46
Цитата Сообщение от LVV Посмотреть сообщение
UNIX. Разработка сетевых приложений?
Эта.
1
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
07.02.2019, 14:28
TCP/IP Illustrated 2й том (если верно помню, в нем HTTP разбирают), то же не повредит
1
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
07.02.2019, 22:43
This book about Winsock (WSA or Windows Sockets API):
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
12.02.2019, 07:14  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
В коде который вы показываете, без FIONBIO сервер будет спать в accept() или обрабатывать запрос одного клиента
Ну, да... Так и есть. Только я случайно в примере не туда влепил FIONBIO.
На самом деле, сделано так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
........
int listen_socket = socket(...........);
octlsocket(listen_socket, FIONBIO, ...);
 
bind(listen_socket...........);
listen(listen_socket.........);
 
int client_socket;
 
    while (true) 
   {
      client_socket = -1;
      result = -1;
      client_socket = accept(listen_socket....);
      result = recv(client_socket.............);
                 //ЗДЕСЬ ИДЕТ ОБРАБОТКА ЗАПРОСА//
      closesocket(client_socket);
   }

Цитата Сообщение от prik Посмотреть сообщение
С FIONBIO он будет жрать процессор
Действительно, неблокируемый сокет с FIONBIO жрёт 30-40% ресурса процессора, в то время как блокируемый - меньше 1%
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.02.2019, 07:14
Помогаю со студенческими работами здесь

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое IIS и что такое PWS? Почему одно без другого не работает?
вот уже второй день пытаюсь немного разобраться в АСП. накидал небольшую тестовую страничку. но с серверами я ничего не понимаю! что...

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Что такое напряжение и что такое сила тока с позиции заряженных частиц
Объясните пожалуйста, что такое напряжение и что такое сила тока с позиции заряженных частиц. Например, имеется проводник в цепи, чем...

Что такое монитор и что такое мьютекс? Это же разные вещи?
Здравствуйте. В разных айти-статьях по-разному используют эти термины, причём часто их путают друг с другом. Хотелось бы, чтобы кто-нибудь...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru