将C FILE指针传递给curl_easy_setopt函数的正确方法

时间:2012-10-19 00:18:02

标签: c curl libcurl

我正在基于以下示例程序在RHEL 4 Linux上的C中创建一个SMTP客户端程序:

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

每当我通过stdin将消息正文传递给程序时,程序都能正常工作。但是,当我尝试将FILE指针传递给curl_easy_setopt()函数时,我遇到了段错误。注释(来自示例程序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

BTW: ./ r 是我的shell脚本,它正在调用./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将同一文件传递给程序时,程序正常执行。但是,这需要用stdin替换f_msg。

curl_easy_setopt(curl, CURLOPT_READDATA, f_msg);

我是否正确传递了FILE指针?

1 个答案:

答案 0 :(得分:1)

是的,您确实正确传递了文件指针。虽然看起来你立刻关闭它。如果你这样做,curl稍后会尝试从该文件中读取并崩溃。只有在不再需要它时才需要关闭它。