Возврат указателя на структуру в программировании сокетов - PullRequest
1 голос
/ 22 июля 2011

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

1 Ответ

6 голосов
/ 22 июля 2011

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

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

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

...