2015-08-15 2 views
1

Итак, я играю с обратными вызовами в GNUTLS.Как передать функцию в качестве аргумента с аргументами?

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

Я мог бы просто выполнять их вне функций глобальных переменных, но это не потокобезопасно.

Возможно ли это? Если нет, как это можно сделать?

+0

Вы используете класс? Потому что, если вы этого не сделаете, было бы проще реализовать то, о чем вы говорите, с классом. –

+0

@GabrielMello Это не имеет никакого отношения к этому. – JavaProphet

ответ

1

GnuTLS поддерживает пользовательские аргументы в обратных вызовах. Для функции push и pull вы устанавливаете их через gnutls_transport_set_ptr. Вы передаете указатель на структуру, содержащую ваши данные, и используете ее в своем обратном вызове.

На более общем уровне ответ: если ваша библиотека не поддерживает пользовательские параметры, вам не повезло. В C нет возможности обмануть дополнительный параметр. Если вы когда-нибудь найдете такую ​​библиотеку, сделайте свою услугу и не используйте ее. И если альтернативы нет, вы можете использовать потокобезопасные контейнеры или локальное хранилище потоков. Но это действительно уродливо.

+0

Не задано set_ptr для установки sockfd в set_int? – JavaProphet

+0

A __thread prefixed global решил проблему хорошо. – JavaProphet

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