Top | ![]() |
![]() |
![]() |
![]() |
void | milter_client_init () |
void | milter_client_quit () |
GOptionGroup * | milter_client_get_option_group () |
milter-clientライブラリはクライアント側のすべてのmilterプロトコルを処理する機能を提供します。「クライアント側」というのは「milter側」ということで、「MTA側」ではありません。
milter-clientライブラリでの主要なクラスはMilterClient
とMilterClientContext
です。MilterClient
はMTAからの複数の接続を受け付け、各接続はMilterClientContext
が処理します。
You need to set connection spec and connect “connection-established” signal before entering mail loop.
接続指定はMTAがMilterClient
に接続するためのエントリポイントです。接続指定は「プロトコル:情報」という形式になっています。IPv4ソケットでは「inet:ポート番号」、「inet:ポート番号@ホスト名」、「inet:ポート番号@[IPv4アドレス]」が正しい形式です。IPv6ソケットでは、「inet6:ポート番号」、「inet6:ポート番号@ホスト名」、「inet6:ポート番号@[IPv6アドレス]」が正しい形式です。UNIXドメインソケットでは「unix:パス」が正しい形式です。
MilterClient
emits “connection-established” signal. MilterClientContext
setup should be done in the signal. In many cases, you just connect callbacks to the passed MilterClientContext
. See MilterClientContext
for available signals.
milter_client_run() is running main loop function. You can enter into main loop after you finish to prepare your MilterClient
.
milter-clientライブラリを使った例です。tool/milter-test-client.cも見てください。milter-test-client.cはmilter-clientライブラリを使ったmilterの実装例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <stdlib.h> #include <milter/client.h> static void cb_connection_established (MilterClient *client, MilterClientContext *context, gpointer user_data) { connect_to_your_interesting_signals(client, context, user_data); } int main (int argc, char **argv) { gboolean success; const gchar spec[] = "inet:10025@localhost"; MilterClient *client; GError *error = NULL; milter_init(); milter_client_init(); client = milter_client_new(); if (!milter_client_set_connection_spec(client, spec, &error)) { g_print("%s\n", error->message); g_error_free(error); return EXIT_FAILURE; } g_signal_connect(client, "connection-established", G_CALLBACK(cb_connection_established), NULL); milter_client_run(client); milter_client_quit(); milter_quit(); return success ? EXIT_SUCCESS : EXIT_FAILURE; } |
Sendmailが提供するlibmilterは各接続毎にスレッドを生成するモデルです。しかし、milter-clientライブラリはこのモデルを使いません。milter-clientライブラリは2つのスレッドを使います。1つのスレッドはMilterClient
用のスレッドで、もう1つのスレッドはMilterClientContext
用のスレッドです。1つ目のスレッドではMilterClient
がMTAからの接続を受け付けて、それを割り振るだけです。MilterClientContext
に関連付けられた各接続は、2つ目のスレッド内で処理を行います。milter-clientライブラリのモデルはmemcachedのモデルと同じです。(memcachedはイベントループのバックエンドにlibeventを使っていますが、milter-clientライブラリはGLibのGMainLoop
を使っています。)
libmilterのモデルは接続を受け付けるためにmilter-clientライブラリのモデルよりも多くコストがかかります。これは、libmilterのモデルがスレッドを生成するのに対して、milter-clientライブラリは単にMilterClientContext
オブジェクトを生成するだけだからです。ただし、多くの場合、この違いはボトルネックとはなりません。:-|