2013-12-10 2 views
0

Я разрабатываю управляемый событиями сервер сокетов Win32 в C. Для управления несколькими аспектами процесса связи мне нужно создать структуру данных в тот момент, когда новое соединение принято, однако я не нашел способ привязать данные моего приложения к вновь принятому сокету таким образом, что, зная сокет, я могу эффективно извлекать данные управления соединением, из-за этого каждый раз, когда я получаю сообщение FD_READ или FD_CLOSE, я должен выполнить операцию поиска, но несмотря на то, что функция поиска очень эффективна, она все еще подразумевает накладные расходы.Можно ли прикрепить данные приложения к гнезду?

Интересно, есть ли набор функций, подобных SetWindowLongPtr/GetWindowLongPtr, которые могут позволить мне прикрепить данные моего приложения к каждому новому сокету, таким образом я мог бы полностью избежать операции поиска.

ПОЯСНЕНИЕ:

Я не искал более эффективный способ поиска, тот, я использую довольно эффективен, что я хочу, это способ, чтобы полностью избежать какого-либо операции поиска (если такая вещь возможна).

+0

Поскольку сокеты представлены файловыми дескрипторами, вы можете просто использовать базовый тип глобальной структуры поиска. – Linuxios

+0

Как вы мультиплексируете несколько сокетов? С помощью WSAAsyncSelect() (в котором вы можете кодировать индекс в сообщении), выберите() (в этом случае вам все равно нужен линейный поиск) или что-то еще? – nos

ответ

1

Для того, чтобы избежать необходимости для поиска данных сокета каждый раз, переключиться на I/O Завершение Порт:

Windows Sockets 2.0: Write Scalable Winsock Apps Using Completion Ports

Создание IOCP с CreateIoCompletionPort() и ассоциировать каждый принятый сокет с ней, а затем выполнить асинхронный сокет Операций ввода-вывода с использованием WSASend() и WSARecv(), которые позволяют передавать пользовательский указатель данных с каждой операцией. Определите и выделите для этой цели пользовательский struct. Затем периодически вызывайте GetQueuedCompletionStatus(), например, в рабочий поток, и каждое уведомление IOCP предоставит вам указатель struct, который был связан с завершенной операцией сокета.

+0

Спасибо, хотя мне было очень сложно заставить его работать, мне потребовалось 2 дня, чтобы понять весь процесс, главным образом потому, что все примеры там: слишком сложны, слишком многословны, плохо объяснены до крайности или отсутствуют ключевая тема. Еще раз спасибо! –

Смежные вопросы