Возврат указателя на структуру в программировании сокетов

В одном из моих проектов opendir() вызов в клиентской программе вмешивается с использованием LD_PRELOAD и отправляется на сервер файлов для его обработки (я делаю некоторые входы в систему на сервере перед вызовом opendir()). При этом звонок проходит через сокет. Теперь, как мне вернуть указатель на структуру DIR (которая возвращается из opendir() вызов) с сервера на клиент через сокет. Должен ли я преобразовать его в строку и отправить?

1 ответ

Решение

Клиент и сервер имеют разные адресные пространства, даже если они находятся на одной машине. Поэтому вы не можете отправить указатель через сокет и ожидать, что он сделает что-то значимое на другом конце.

Один действительный способ сделать это - поместить структуру в раздел общей памяти и отправить смещение в область общей памяти. Очевидно, это также будет работать, только если клиент и сервер находятся на одной физической машине.
РЕДАКТИРОВАТЬ:
И, хотя это будет работать для чтения данных, вы должны (очевидно) остерегаться вызова функций, таких как closedir или иным образом освобождая память от другого процесса. Такие вещи почти наверняка означают ужасную неудачу (в смысле: теперь ты умрешь).

В "нормальном" случае, когда клиент и сервер находятся на разных машинах, вы никак не можете сделать это вообще. Конечно, вы можете отправлять строковые данные или сериализованные данные просто отлично, но никогда не используйте указатели или что-то подобное.

Другие вопросы по тегам