Эффективное отображение пользователей на сокеты - PullRequest
0 голосов
/ 17 сентября 2010

Я спорю о том, как сопоставить структуру User с дескриптором файла сокета. Я рассматривал вопрос о сохранении массива указателей void размера MAX_CONNECTIONS и сохранении указателя в качестве значения ключа дескриптора файла.

Проблема, с которой я сталкиваюсь, заключается в том, как я планирую обращаться с получателями. В настоящее время я вызываю pipe() для создания канала, а затем fork() процесс для обработки recv. Я бы, вероятно, тоже хотел бы отследить их, чтобы справиться.

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

Вопрос: Это эффективный и / или приемлемый метод сопоставления сокетов пользователям, подключенным к ним, или я должен практиковать какой-то другой вид вуду?

Я ценю любые усилия, направленные на решение моей (вероятно, бессмысленной) дилеммы.

1 Ответ

3 голосов
/ 17 сентября 2010

Если у вас мало клиентов, тогда все в порядке.Вы не будете тратить много времени только на группу пользователей.Возможно, вы захотите попробовать использовать хеш-таблицу (или словарь, ассоциативный массив).

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

Операции с хеш-таблицей в среднем O (1).Сама хеш-таблица использует пространство O (N), где N - большое число (но не слишком большое).Об этом тоже не беспокойтесь.

Взгляните на этот .Вас также может заинтересовать этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...