Libcurl筆記五_easy模式運行原理


1,

curl_easy_init內部調用Curl_open創建一個結構體SessionHandle(里面包含了所以curl使用的數據和指針)並初始化一些數據,然后返回將其作為給外側使用的句柄CURL*。

2,
curl_easy_setopt調用Curl_setopt,其內部一個switch,case所有支持的參數來設置上面init的SessionHandle中相應數據。

3,curl_easy_perform內部會創建一個multi結構並讓其與相互指向
multi = data->multi_easy;
data->multi = multi;

static CURLcode easy_perform(struct SessionHandle *data, bool events)
{
CURLM *multi;
CURLMcode mcode;

if(data->multi) {
failf(data, "easy handle already used in multi handle");
return CURLE_FAILED_INIT;

}

if(data->multi_easy)
multi = data->multi_easy;
else {
/* this multi handle will only ever have a single easy handled attached
to it, so make it use minimal hashes */
multi = Curl_multi_handle(1, 3);
if(!multi)
return CURLE_OUT_OF_MEMORY;
data->multi_easy = multi;
}

mcode = curl_multi_add_handle(multi, data);
data->multi = multi;

/* run the transfer */
result = events ? easy_events(multi) : easy_transfer(multi);
(void)curl_multi_remove_handle(multi, data);
return result;
}


4,
curl_multi_perform內部由multi_runsingle執行真正的一些列http操作。
multi_runsingle由一個while循環內不斷的switch-case 20種 CURLMstate狀態執行相應操作並指定下一個狀態傳遞操作直到結束。
static CURLMcode multi_runsingle(struct Curl_multi *multi,

struct timeval now,

struct SessionHandle *data)

{
do {
switch(data->mstate) {
case CURLM_STATE_INIT:
result=Curl_pretransfer(data);
multistate(data, CURLM_STATE_CONNECT);
break;
case CURLM_STATE_CONNECT:
result = Curl_connect(data, &data->easy_conn,
&async, &protocol_connect);
multistate(data, CURLM_STATE_CONNECT_PEND);
break;
case CURLM_STATE_WAITCONNECT:
result = Curl_is_connected(data->easy_conn, FIRSTSOCKET, &connected);
multistate(data, data->easy_conn->bits.tunnel_proxy?
CURLM_STATE_WAITPROXYCONNECT:
CURLM_STATE_SENDPROTOCONNECT);
break;
case CURLM_STATE_PERFORM:
result = Curl_readwrite(data->easy_conn, data, &done);
multistate(data, CURLM_STATE_DONE);
break;
}while((rc == CURLM_CALL_MULTI_PERFORM) || multi_ischanged(multi, FALSE))
}


5,
case CURLM_STATE_INIT:
創建連接數據並初始化之



case CURLM_STATE_CONNECT:
為上面創建的連接結構綁定socket


case CURLM_STATE_WAITCONNECT:
使用select模型開始socket操作


case CURLM_STATE_PERFORM:
收到數據了,使用之前easy_setopt設置在Session
Handle結構中的回調函數寫數據。


6,curl_easy_cleanup清空
SessionHandle結構,
當然會先調用curl_multi_cleanup清空關聯的multi結構。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM