在网上找到了这个网页,它返回的html代码在body标签中只有访问者的ip,可以很方便的进行解析。下载的任务就交个了libcurl库,它是一个强大的下载库,支持很多不同的协议。根据官方的文档,能够很方便的将页面下载到内存中,而且正好只有body标签里面的数据,免去了字符处理的步骤。关键代码:
[cc lang='c' ]
char *fetchIP(char *url)
{
char *IP = (char*)malloc(20);
CURL *curl_handle;
struct memStruct memHtml =
{ NULL, 0 };
curl_global_init(CURL_GLOBAL_ALL);
curl_handle = curl_easy_init(); //初始化curl句柄
curl_easy_setopt(curl_handle, CURLOPT_URL, url); //设置url
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, writeMemoryCallback); //设置回调函数
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&memHtml); //设置保存的结构
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); //设置agent
CURLcode ret = curl_easy_perform(curl_handle);
//返回了错误代码,打印错误,返回NULL指针
if (ret != CURLE_OK)
{
printf("error(%d): %s", ret, curl_easy_strerror(ret));
curl_easy_cleanup(curl_handle);
curl_global_cleanup();
return NULL;
}
curl_easy_cleanup(curl_handle);
strncpy(IP, memHtml.memory, memHtml.size - 1);
if (memHtml.memory)
{
free(memHtml.memory);
}
curl_global_cleanup();
return IP;
}
[/cc]
其中memStruct结构定义为:
[cc lang='c' ]
struct memStruct
{
char *memory;
size_t size;
};
[/cc]
回调函数主要是将获取到的值存入自定义的结构中:(其中第一个参数为实际下载的数据,后面两个size_t类型的参数的乘积是此次下载数据的总长度,最后一个参数为注册保存数据结构的指针)
[cc lang='c' ]
static size_t writeMemoryCallback(void *ptr, size_t size, size_t nmemb,
void *data)
{
size_t realsize = size * nmemb;
struct memStruct *mem = (struct memStruct*) data;
mem->memory = myrealloc(mem->memory, mem->size + realsize + 1);
if (mem->memory)
{
memcpy(&(mem->memory[mem->size]), ptr, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
}
return realsize;
}
[/cc]
获取了ip地址之后,就是要发送邮件了。这里为了简单起见,直接调用了系统的mail命令发送邮件。
[cc lang='c' ]
int mail(char *destination, char *subject, char *content)
{
FILE *fp;
char command[1024];
fp = fopen("/tmp/letter", "w");
fputs(content, fp);
fclose(fp);
sprintf(command, "mail -s %s %s <letter", subject, destination);
int ret = system(command);
system("rm -f /tmp/letter");
return ret;
}
[/cc]
不过,即使是使用了mail命令,也需要在本地架设邮件服务器,因为在自己的笔记本电脑上装的是postfix,所以在龙芯电脑上装的也是postfix。安装非常方便,直接apt-get install postfix就可以了,后面设置成直接发送邮件。
但是这样的设置会有问题,mail命令发送到gmail的邮件都被认为是垃圾邮件,即使能够添加过滤器来阻止,但有时候gmail的smtp服务器会直接阻止邮件的发送。所以需要重新设置下postfix。我把postfix设置成了使用gmail的smtp发送邮件。具体设置方法比较麻烦,参考的是这里。不过里面的脚本因为写死了路径,不太好用,还是建议直接按照后面的手工操作步骤来执行。不过手工执行的时候还是要注意路径,特别是生成的认证文件的路径,如果签名或者其他步骤中提示有文件找不到,需要调整文件的路径。