对CURL的一些研究

http://www.kuqin.com/article/23candcplusplus/586014.html

前两天看到有人求客户端socket 发HTTP包的代码,受flw版主启发找了一些perl的资料,不过对perl 还是不太熟悉。也没有深入的研究。无意中发现了libcurl.so 这个库。去google上搜索发现它是处理客户端发送HTTP请求的库 以及可以处理web服务器回送回来的包。研究了两天将研究的成果,共享出来给大家一起研究。

参考:http://curl.haxx.se/  这是curl开发者的首页。

利用libcurl.so库 我们能轻松的连接某个web站点。获得某个首页的html代码 或者是http 请求的头部。 还可以提交表单,
此外它还支持ftp,https,

/usr/include/curl/curl.h 中。

1 CURLcode curl_global_init(long flags);

描述:
这个函数只能用一次。(其实在调用curl_global_cleanup 函数后仍然可再用)
如果这个函数在curl_easy_init函数调用时还没调用,它讲由libcurl库自动完成。

参数:flags

CURL_GLOBAL_ALL    //初始化所有的可能的调用。
CURL_GLOBAL_SSL    //初始化支持 安全套接字层。
CURL_GLOBAL_WIN32  //初始化win32套接字库。
CURL_GLOBAL_NOTHING     //没有额外的初始化。

2 void curl_global_cleanup(void);

描述:在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。

3 char *curl_version( );

描述: 打印当前libcurl库的版本。

4 CURL *curl_easy_init( );

描述:
curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样). 相应的在调用结束时要用curl_easy_cleanup函数清理.
一般curl_easy_init意味着一个会话的开始. 它的返回值一般都用在easy系列的函数中.

5  void curl_easy_cleanup(CURL *handle);

描述:
这个调用用来结束一个会话.与curl_easy_init配合着用.

参数:
CURL类型的指针.

6  CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);

描述: 这个函数最重要了.几乎所有的curl 程序都要频繁的使用它.
它告诉curl库.程序将有如何的行为. 比如要查看一个网页的html代码等.
(这个函数有些像ioctl函数)

参数:
1 CURL类型的指针
2 各种CURLoption类型的选项.(都在curl.h库里有定义,man 也可以查看到)
3 parameter 这个参数 既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量.它用什么这取决于第二个参数.

CURLoption 这个参数的取值很多.具体的可以查看man手册.

7 CURLcode curl_easy_perform(CURL *handle);

描述:这个函数在初始化CURL类型的指针 以及curl_easy_setopt完成后调用. 就像字面的意思所说perform就像是个舞台.让我们设置的
option 运作起来.

参数:
CURL类型的指针.



 mq110 回复于:2005-07-31 09:43:58

下面来看一个简单的例子:
用来获得某个主页的html代码

#include <stdio.h>;#include <curl/curl.h>;#include <stdlib.h>;

int main(int argc, char *argv[]){    CURL *curl;			//定义CURL类型的指针    CURLcode res;		//定义CURLcode类型的变量

    if(argc!=2)    {        printf("Usage : file <url>;\n");        exit(1);    }

    curl = curl_easy_init();	//初始化一个CURL类型的指针    if(curl!=NULL)    {	//设置curl选项. 其中CURLOPT_URL是让用户指定url. argv[1]中存放的命令行传进来的网址        curl_easy_setopt(curl, CURLOPT_URL, argv[1]);		//调用curl_easy_perform 执行我们的设置.并进行相关的操作. 在这里只在屏幕上显示出来.        res = curl_easy_perform(curl);	//清除curl操作.        curl_easy_cleanup(curl);    }    return 0;}

编译: gcc -o 001 -Wall 001.c -lcurl

我们来获得www.chinaunix.net 主页的html代码

./001 www.chinaunix.net



 mq110 回复于:2005-07-31 09:44:51

再来看一个例子:
实际编程时 我们未必只显示出来.我们的目的是要对获得html代码做相应的处理.比如检验关键字,发现重要信息等等.

那么我们就需要把获得的html代码存入相应的文件中.看下面一个例子

#include <stdio.h>;#include <stdlib.h>;#include <unistd.h>;

#include <curl/curl.h>;#include <curl/types.h>;#include <curl/easy.h>;

FILE *fp;  //定义FILE类型指针

size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)  //这个函数是为了符合CURLOPT_WRITEFUNCTION, 而构造的{    int written = fwrite(ptr, size, nmemb, (FILE *)fp);    return written;}

int main(int argc, char *argv[]){    CURL *curl;

    curl_global_init(CURL_GLOBAL_ALL);      curl=curl_easy_init();    curl_easy_setopt(curl, CURLOPT_URL, argv[1]);  

    if((fp=fopen(argv[1],"w"))==NULL)    {        curl_easy_cleanup(curl);        exit(1);    }    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);  //CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理    curl_easy_perform(curl);    curl_easy_cleanup(curl);    exit(0);}

gcc -o 002 -Wall 002.c -lcurl
./002 www.chinaunix.net
这个例子就将html代码保存在了www.chinaunix.net文件中了.



 mq110 回复于:2005-07-31 09:45:42

此外还可以获得http报文的头部 post表单 等等. 这里就不详细的介绍了. 具体的可以man curl_easy_setopt
(要用到一个重要的结构体,HttpPost)

下面看一个从ftp站点下载文件的例子.

#include <stdio.h>;#include <curl/curl.h>;#include <curl/types.h>;#include <curl/easy.h>;

struct FtpFile   //定义一个结构为了传递给my_fwrite函数.可用curl_easy_setopt的CURLOPT_WRITEDATA选项传递{        char *filename;        FILE *stream;};

int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream){        struct FtpFile *out=(struct FtpFile *)stream;  // stream指针其实就是 指向struct FtpFile ftpfile的        if(out && !out->;stream)        {                out->;stream=fopen(out->;filename, "wb"); //没有这个流的话就创建一个 名字是out->;filename.                if(!out->;stream)                return -1;        }        return fwrite(buffer, size, nmemb, out->;stream);}

int main(int argc, char *argv[]){        CURL *curl;        CURLcode res;        struct FtpFile ftpfile={argv[2],NULL};  //初始化一个FtpFile结构         curl_global_init(CURL_GLOBAL_DEFAULT);

        curl = curl_easy_init();        if(curl)        {                curl_easy_setopt(curl, CURLOPT_URL,argv[1]);                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);                curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);  //给相关函数的第四个参数 传递一个结构体的指针                curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE);  //CURLOPT_VERBOSE 这个选项很常用 用来在屏幕上显示对服务器相关操作返回的信息

                res = curl_easy_perform(curl);                curl_easy_cleanup(curl);

                if(CURLE_OK != res)                        fprintf(stderr, "curl told us %d\n", res);        }        if(ftpfile.stream)        fclose(ftpfile.stream);        curl_global_cleanup();

        return 0;}

gcc -o 003 -Wall 003.c -lcurl
./003  ftp://202.96.64.144/fei.gif    fei.gif

我有个匿名的ftp的网址 将目录下的fei.gif 保存到本地 也叫fei.gif

此外还有curl_escape curl_unescape函数用来转换 汉字成 %XX 这种类型.以及转换回来.如果要下载带有汉字的文件.先要调用将字符串转换一下.

curl 库 还有好多功能. 有待大家来挖掘.



 luojiannx 回复于:2005-07-31 10:01:28

:mrgreen: 建议版主加精华



 双眼皮的猪 回复于:2005-07-31 10:05:29

:mrgreen:  :mrgreen:  :mrgreen: 
好东东~建议加精^_^



 kernelxu 回复于:2005-07-31 10:10:43

嗯,写的很不错,先收藏再研究。建议版主给个精华吧!



 mq110 回复于:2005-07-31 10:26:00

谢谢 楼上的各位支持.谢谢斑竹.



 wwy 回复于:2005-07-31 10:29:00

精华! 支持



 surfzsl 回复于:2005-07-31 10:37:34

引用:原帖由 "mq110"]谢谢 楼上的各位支持.谢谢斑竹.
 发表:

感谢CU感谢我忠实的READER感谢大家的支持
......
 :mrgreen:  :mrgreen:  :mrgreen:  :mrgreen:  :mrgreen: 
恩,不错.楼主继续,发掘出更好的东东给大家
 :em17:  :em17:  :em17:  :em17:  :em17:



 homesp 回复于:2005-07-31 11:30:45

谢谢楼主,建议加精,收下了



 bitmilong 回复于:2005-11-17 22:48:30

哈哈,110,俺正好用到,谢了

Btw:真奇怪,花了俩CU币的搜的,居然搜不到你这文章,用Google搜文章名也没搜到,最后俺还是在别的坛子上找到的这个贴子的翻版,因为内容里含CU,所以认定是CU上的,然后又用内容搜索才搜到在CU上的,哎...

原来CU的搜索是区分大小写的,汗~

[ 本帖最后由 bitmilong 于 2005-11-17 23:23 编辑 ]



 lenovo 回复于:2005-11-17 22:53:45

引用:原帖由 bitmilong 于 2005-11-17 22:48 发表
哈哈,110,俺正好用到,谢了

Btw:真奇怪,花了俩CU币的搜的,居然搜不到你这文章,用Google搜文章名也没搜到,最后俺还是在别的坛子上找到的这个贴子的翻版,因为内容里含CU,所以认定是CU上的,然后又用内容搜索才搜 ... 

据说现在搜索不要cu币?:roll:



 bitmilong 回复于:2005-11-17 23:00:55

引用:原帖由 lenovo 于 2005-11-17 22:53 发表

据说现在搜索不要cu币?:roll: 

汗一个,CU币整D俺半年都不敢搜东西,原来现在都不用了:oops:



 bitmilong 回复于:2005-11-17 23:07:59

借机会问下110,glibcurl有研究没?



 lenovo 回复于:2005-11-17 23:09:03

引用:原帖由 bitmilong 于 2005-11-17 23:00 发表

汗一个,CU币整D俺半年都不敢搜东西,原来现在都不用了:oops: 

说错了别找我呀。:wink:



 er 回复于:2005-11-18 08:41:20

支持



 mageguoshi 回复于:2005-11-18 10:14:53

收藏。顶!



 Solaris12 回复于:2005-11-18 10:29:05

引用:原帖由 mq110 于 2005-7-31 09:43 发表
前两天看到有人求客户端socket 发HTTP包的代码,受flw版主启发找了一些perl的资料,不过对perl 还是不太熟悉。也没有深入的研究。无意中发现了libcurl.so 这个库。去google上搜索发现它是处理客户端发送HTTP请求的 ... 

不错,用curl加上shell可以很轻松的作出来测试http和https服务器的test suite.



 redog 回复于:2005-11-18 10:53:38

好呀 支持精华!



 alex99051 回复于:2006-02-24 13:58:14

gcc的时候出现这个错误,是什么啊?

/tmp/ccCMAPrW.o(.text+0x16): In function `main‘:
: undefined reference to `curl_global_init‘
/tmp/ccCMAPrW.o(.text+0x3e): In function `main‘:
: undefined reference to `curl_easy_init‘
/tmp/ccCMAPrW.o(.text+0x5f): In function `main‘:
: undefined reference to `curl_easy_setopt‘
/tmp/ccCMAPrW.o(.text+0x6d): In function `main‘:
: undefined reference to `curl_easy_perform‘
/tmp/ccCMAPrW.o(.text+0x7e): In function `main‘:
: undefined reference to `curl_easy_cleanup‘
collect2: ld returned 1 exit status

知道了,gcc的时候 -lcurl

[ 本帖最后由 alex99051 于 2006-2-24 14:31 编辑 ]



 mq110 回复于:2006-02-24 14:26:45

-lcurl



 alex99051 回复于:2006-02-24 14:43:46

看的时候不仔细,愧对斑竹了:)



 chenlihuiabc 回复于:2006-02-24 15:46:55

我也正在研究,谢谢,收藏



 bleem1998 回复于:2006-02-24 17:54:31

收藏
支持斑竹



 net_robber 回复于:2006-02-24 18:38:51

今天看了一天代码了,累了,明天再看



 xuzhangri 回复于:2006-02-27 18:08:51

不错得,研究了半天,真累



 守夜人 回复于:2006-03-03 20:42:04

太有用了谢谢版主....
请教版主,我想用socket实现你上面类似的可以显示网站首页的功能,不知应该如何实现,能不能大致讲讲实现方法?谢谢了



 wxgchinaunix 回复于:2006-03-28 12:00:02

好人,绝对精华!



 GodPig 回复于:2008-01-10 20:33:21

不能不顶!!!!!!!!!!!!!!!!!!!!



 frank_seng 回复于:2009-06-11 21:17:02

补充一个抽取HTTP Header的例子,LZ别见怪哈:
  [table=95%][tr][td][font=FixedSys][color=#000000] [/color][/font][font=FixedSys][color=#000000]1 [color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#0000cc]<[/color]stdio[color=#0000cc].[/color]h[color=#0000cc]>[/color]
[/color][/font][font=FixedSys][color=#000000] [/color][/font][font=FixedSys][color=#000000]2 [color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#0000cc]<[/color]stdlib[color=#0000cc].[/color]h[color=#0000cc]>[/color]
[/color][/font][font=FixedSys][color=#000000] [/color][/font][font=FixedSys][color=#000000]3 [color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#0000cc]<[/color]unistd[color=#0000cc].[/color]h[color=#0000cc]>[/color]
[/color][/font][font=FixedSys][color=#000000] [/color][/font][font=FixedSys][color=#000000]4 [color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#0000cc]<[/color]curl[color=#0000cc]/[/color]curl[color=#0000cc].[/color]h[color=#0000cc]>[/color]
[/color][/font][font=FixedSys][color=#000000] [/color][/font][font=FixedSys][color=#000000]5 [color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#0000cc]<[/color]curl[color=#0000cc]/[/color]types[color=#0000cc].[/color]h[color=#0000cc]>[/color]
[/color][/font][font=FixedSys][color=#000000] [/color][/font][font=FixedSys][color=#000000]6 [color=#0000cc]#[/color][color=#ff0000]include[/color] [color=#0000cc]<[/color]curl[color=#0000cc]/[/color]easy[color=#0000cc].[/color]h[color=#0000cc]>[/color]
[/color][/font][font=FixedSys][color=#000000] [/color][/font][font=FixedSys][color=#000000]7 
[/color][/font][font=FixedSys][color=#000000] [/color][/font][font=FixedSys][color=#000000]8 
[/color][/font][font=FixedSys][color=#000000] [/color][/font][font=FixedSys][color=#000000]9 [color=#ff0000]size_t[/color] write_data[color=#0000cc]([/color][color=#0000ff]void[/color] [color=#0000cc]*[/color]ptr[color=#0000cc],[/color] [color=#ff0000]size_t[/color] size[color=#0000cc],[/color] [color=#ff0000]size_t[/color] nmemb[color=#0000cc],[/color] [color=#0000ff]void[/color] [color=#0000cc]*[/color]stream[color=#0000cc])[/color]
 10 [color=#0000cc]{[/color]
 11     [color=#ff0000]printf[/color][color=#0000cc]([/color][color=#ff00ff]"%s--------------------------------------------------------\n"[/color][color=#0000cc],[/color]  ptr[color=#0000cc])[/color][color=#0000cc];[/color]
 12     [color=#0000ff]char[/color][color=#0000cc]*[/color] ptr1 [color=#0000cc]=[/color] [color=#0000cc]([/color][color=#0000ff]char[/color][color=#0000cc]*[/color][color=#0000cc])[/color]ptr[color=#0000cc];[/color]
 13     [color=#0000ff]if[/color] [color=#0000cc]([/color]ptr1[color=#0000cc][[/color]0[color=#0000cc]][/color] [color=#0000cc]=[/color][color=#0000cc]=[/color] [color=#ff00ff]‘\r‘[/color] [color=#0000cc]|[/color][color=#0000cc]|[/color] ptr1[color=#0000cc][[/color]1[color=#0000cc]][/color] [color=#0000cc]=[/color][color=#0000cc]=[/color] [color=#ff00ff]‘\n‘[/color][color=#0000cc])[/color]
 14         [color=#0000ff]return[/color] 0[color=#0000cc];[/color]
 15 
 16     [color=#0000ff]return[/color] nmemb[color=#0000cc];[/color]
 17 [color=#0000cc]}[/color]
 18 
 19 
 20 [color=#0000ff]int[/color] main[color=#0000cc]([/color][color=#0000ff]int[/color] argc[color=#0000cc],[/color] [color=#0000ff]char[/color] [color=#0000cc]*[/color]argv[color=#0000cc][[/color][color=#0000cc]][/color][color=#0000cc])[/color]
 21 [color=#0000cc]{[/color]
 22      CURL [color=#0000cc]*[/color]curl[color=#0000cc];[/color]
 23      curl_global_init[color=#0000cc]([/color]CURL_GLOBAL_ALL[color=#0000cc])[/color][color=#0000cc];[/color]
 24      curl[color=#0000cc]=[/color]curl_easy_init[color=#0000cc]([/color][color=#0000cc])[/color][color=#0000cc];[/color]
 25      curl_easy_setopt[color=#0000cc]([/color]curl[color=#0000cc],[/color] CURLOPT_URL[color=#0000cc],[/color] argv[color=#0000cc][[/color]1[color=#0000cc]][/color][color=#0000cc])[/color][color=#0000cc];[/color]
 26 
 27      curl_easy_setopt[color=#0000cc]([/color]curl[color=#0000cc],[/color] CURLOPT_HEADERFUNCTION[color=#0000cc],[/color] write_data[color=#0000cc])[/color][color=#0000cc];[/color]   
 28      curl_easy_perform[color=#0000cc]([/color]curl[color=#0000cc])[/color][color=#0000cc];[/color] 
 29      curl_easy_cleanup[color=#0000cc]([/color]curl[color=#0000cc])[/color][color=#0000cc];[/color]
 30      
 31      [color=#ff0000]exit[/color][color=#0000cc]([/color]0[color=#0000cc])[/color][color=#0000cc];[/color]
 32 [color=#0000cc]}[/color][/color][/font][/td][/tr][/table]

说明:在 cURL 网站的 curl_easy_setopt.3 -- man page 中可以看到如下字段:

CURLOPT_HEADERFUNCTION

Function pointer that should match the following prototype: size_t function( void *ptr, size_t size, size_t nmemb, void *stream);. This function gets called by libcurl as soon as it has received header data. The header callback will be called once for each header and only complete header lines are passed on to the callback. Parsing headers should be easy enough using this. The size of the data pointed to by ptr is size multiplied with nmemb. [color=Red]Do not assume that the header line is zero terminated! [/color]The pointer named stream is the one you set with the CURLOPT_WRITEHEADER option. [color=Blue]The callback function must return the number of bytes actually taken care of [/color], or return -1 to signal error to the library (it will cause it to abort the transfer with a CURLE_WRITE_ERROR return code).

[list=1][*]其中红色字段表明,即使使用了 CURLOPT_HEADERFUNCTION 标志,也不代表传给回调函数的仅仅是 Http Header部分的缓冲区,而是带 Http Header 的整个 response 报文缓冲区,所以在会调用函数中用 \r\n 来判断 Http Header 的结束。[*]其中蓝色字段表明,回调函数应该返回实际传给回到函数的缓冲区总字节数 size * memb,否则回调函数第一次被调用后,就会失败。[/list]

时间: 2024-10-14 18:36:13

对CURL的一些研究的相关文章

php curl使用总结(一)

今天和第三方支付做对接的时候,在本地用wamp(php版本5.4.14)运行他们的支付demo的时候,报了一个错误.loadXML函数中不能传空值.排查代码的时候,发现他们用了curl,我以前也接触过curl,但是并没有很深的研究只知道他是一种模拟浏览器传输数据的工具.借着这个机会把curl好好的研究一下. 1.curl是什么 百度百科给的解释是:数据传输神器.那它神器在什么地方那,通过查找资料得出curl可以使用url的语法模拟浏览器来传输数据,因为是模拟浏览器所以它支持多种的网络协议.目前支

Nginx虚拟主机多server_name的顺序问题

Nginx虚拟主机多server_name的顺序问题  大 | 中 | 小  [ 2008-11-28 11:27 | by 张宴 ] [文章作者:张宴 本文版本:v1.0 最后修改:2008.11.28 转载请注明原文链接:http://blog.zyan.cc/post/382/] 今天在配置Nginx + PHP + MediaWiki中,发现一个问题:MediaWiki所在的Nginx虚拟主机绑定了多个域名,但是不管通过什么域名访问MediaWiki首页,都会被跳转到其中的一个域名上.N

最全的libcurl库资源整理

C++ 用libcurl库进行http 网络通讯编程 百度登陆协议分析!!!用libcurl来模拟百度登陆 C++使用libcurl做HttpClient 使用libcurl库进行HTTP的下载 libcurl部分总结  libcurl学习笔记(一) Curl Passing data to a simple function C++ curl模拟登陆 curl获得cookie数据 libcurl 使用及例程  libcurl在vc6下的安装 libcurl使用心得 使用libcurl,根据ur

研究curl

<?php // file_get_contents 如何读取的是一个链接如果链接失效就会服务器挂掉所以要设置超时函数$opts = array( 'http'=>array( 'method'=>"GET", 'timeout'=>10, ) ); $context = stream_context_create($opts); $back=file_get_contents("http://api.yizhancms.com/video/index

cocos2d-x学习笔记(七)利用curl获取资源包的大小

cocos2d-x将curl作为第三方库加进来,所以我们可以很方便的使用它. 最近在研究资源热更新,由于想在用户更新之前提示资源包大小,让用户知道此次更新所需消耗流量,所以在资源热更新AssetsManager类的基础上加入获取资源包大小的代码. 我用的是cocos2d-x 3.4的版本,AssetsManager源文件在cocos2d\extensions\assets-manager目录下. 一.首先在AssetsManager.h文件class AssetsManager底下加入代码 do

windows(64位)下使用curl命令

Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景,因此这里研究下如何在windows下执行curl命令. 工具下载 在官网处下载工具包:http://curl.haxx.se/download.html 使用方式一:在curl.exe目录中使用 解压下载后的压缩文件,通过cmd命令进入到curl.exe所在的目录. 由于博主使用的是windows 64位 的系统,因此可以使用I386下的curl.exe工具. 进入到该目录后,执行curl --hel

curl 模拟登录微信公众平台带验证码

这段时间一直写个项目, 从切图到前端到后台都要搞定,真tm累. 今天下午手残,不停用错误的密码去模拟登录微信公众平台,结果后来出现验证码,瞬间悲剧(菜鸟从来没搞过带验证码的). 研究了一下,发现其实很简单,直接把生成的二维码图片拉过来,让用户自己输入,再提交一遍表单即可.其实中间还是有些坑,比如生成验证码的时候,要把cookie保存下,登录的时候要带上这个cookie,要不然会总是提示需要验证码. 客户端: 1 <body> 2 <form> 3 <p><inpu

grep命令和curl命令的使用方法

今天看了汪海写的python爬虫教程,说实话看不懂...于是就用bash下的工具自己开始写了一个抓取糗事百科的糗事的脚本,期间搜索到了grep和curl命令的一些使用技巧. grep命令,使用grep命令来进行文本的通配,一般只是显示匹配的行,但是使用以下几个参数就可以显示上下文了: -C [num] #显示匹配行的上下各num行 -A [num] #显示匹配行的后num行 -B [num] #显示匹配行的前num行 curl这个下载工具,或者已经算不上是下载工具了,因为curl过于强大了,主要

Http原理及PHP中cURL的使用

为了给接下来的教程做好铺垫,本文将讲述如何用PHP发出Http请求进行模拟登录,顺带会讲一些Http请求原理.模拟登录…就是模拟浏览器登录嘛,所谓请求,只不过是你向网站发一些字,网站又给你回复一些字,这一般都是基于Http或Https协议的.平时是浏览器帮我们做好了这些工作,封装数据发送到指定网站,然后接收,最后编译成网页显示出来.在模拟登录中,呵呵,这些都要我们自己做,只是最后不用编译…只要提取到需要的数据就行了. PHP中模拟登录有三种方式.第一是直接用file_get_contens(网站