Можно ли установить setsockopt () из командной строки - PullRequest
2 голосов
/ 13 мая 2011

Мне нужно изменить sk_rcvlowat программных приложений на тест производительности. Есть ли способ изменить параметры сокета из командной строки? В противном случае мы должны изменить весь исходный код прикладной программы и перекомпилировать их. Я предполагаю, что каждый сокет связан с inode, так что мы можем изменить параметр сокета с помощью inode.

Кстати, может кто-нибудь показать мне, где находился «файл сокета», когда его создавал процесс. Я уже проверил /proc/<pid>/fd/<fd[X]>, но это только символические ссылки, подобные этой 10 -> socket:[13895]

Любые предложения приветствуются. Заранее спасибо.

1 Ответ

1 голос
/ 13 мая 2011

Вы можете создать библиотеку-оболочку, которая будет перехватывать все вызовы на setsockopt и сможет изменять некоторые параметры. Это работает, если ваше приложение имеет вызов setsockopt. В другом случае вы можете обернуть другую функцию, например, socket используя тот же подход. В оболочке socket вам нужно создать сокет с __socket, а затем изменить любой параметр, который вы хотите.

Библиотека Wrapper должна быть динамической, с функцией setsockopt. Эта функция может быть перегружена с помощью glibc. Затем запустите вашу программу следующим образом:

 LD_PRELOAD=path_to_wrapper_library/libwrap.so ./you_program

Библиотека будет вставлена ​​(связана) в программу и заменит функцию setsockopt.

Это работает только с динамически связанными программами (отметьте это с помощью ldd ./you_program - будет некоторое /lib/*.so, если оно динамически связано).

Исходную функцию можно вызвать из вашего кода с префиксом __: __setsockopt или с использованием dlsym(RTLD_NEXT, "setsockopt");.

Некоторые примеры (не setsockopt, а идея предварительной загрузки оболочки): http://scaryreasoner.wordpress.com/2007/11/17/using-ld_preload-libraries-and-glibc-backtrace-function-for-debugging/ или http://developers.sun.com/solaris/articles/lib_interposers_code.html

Компилировать в динамическую библиотеку с:

 gcc wrap.c -fPIC -shared -ldl -o libwrap.so
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...