1

次のサンプル プログラムに基づいて、RHEL 4 Linux で C 言語で SMTP クライアント プログラムを作成しています。

http://curl.haxx.se/libcurl/c/simplesmtp.html

stdin を介してメッセージ本文テキストをプログラムに渡すたびに、プログラムは正しく動作します。ただし、file ポインターを curl_easy_setopt() 関数に渡そうとすると、segfault が発生します。コメント (サンプル プログラム simplesmtp.c から) には、stdin の代わりにファイル ポインターを curl_easy_setopt 関数に渡すことができると記載されています。

simplesmtp.c の関連するコメント セクション

/* You provide the payload (headers and the body of the message) as the
 * "data" element. There are two choices, either:
 * - provide a callback function and specify the function name using the
 * CURLOPT_READFUNCTION option; or
 * - just provide a FILE pointer that can be used to read the data from.
 * The easiest case is just to read from standard input, (which is available
 * as a FILE pointer) as shown here.
 */ 
curl_easy_setopt(curl, CURLOPT_READDATA, stdin);

これらは、CURLOPT_VERBOSE オプションが設定されたコンソールからのエラー行です。

< 250 2.1.5 <myname@mydomain.com>... Recipient ok
> DATA
< 354 Enter mail, end with "." on a line by itself
./r: line 5: 21282 Segmentation fault      ./mysmtpcli -r rcp.txt -m msg.txt

ところで: ./rは ./mysmtpcli -r rcp.txt -m msg.txt を呼び出している私のシェル スクリプトです。

コードのスニペット

FILE *f_msg;
f_msg = fopen(msg_file, "r");
if(!f_msg){
  fprintf(stderr, "Could not load message file: %s\n", msg_file);
  return 1;
}

curl_easy_setopt(curl, CURLOPT_READDATA, f_msg);

fclose(f_msg);

注: msg_file 変数は、コマンド ライン パラメーターから入力され、以下を含む有効なテキスト ファイルです。

件名: テスト メッセージ

これはテスト メッセージです。

「cat msg.txt | ./mysmtpcli -r rcp.txt」を使用して stdin を介してこの同じファイルをプログラムに渡すと、プログラムは正しく実行されます。ただし、これには f_msg を stdin に置き換える必要があります。

curl_easy_setopt(curl, CURLOPT_READDATA, f_msg);

FILE ポインタを正しく渡していますか?

4

1 に答える 1

1

はい、ファイル ポインターを正しく渡します。すぐに閉めるように見えますが。これを行うと、curl は後でそのファイルから読み取ろうとしてクラッシュします。必要がなくなった場合にのみ閉じる必要があります。

于 2012-10-19T00:27:07.363 に答える