[t:/]$ 지식_

cURL. libcurl

2008/08/07

닥치고 위키.
http://en.wikipedia.org/wiki/Libcurl

소켓을 몰라도, 셀렉트를 몰라도 네트워크 프로그래밍이 가능하다. 오만가지 L7 프로그래밍을 쉽게 도와주는 L7 라이브러리 정도로 생각하면 된다.

일단 빌드.
http://curl.haxx.se/download.html

방문해 보면 참 오지랖도 넓은 툴킷이라는 것을 알 수 있다. 삼라만상 니가 짱이셈.

./configure --help 때려서 자기가 할 일을 정한 후.

대충 make all install

빌드가 끝났으면 curl 단독 툴로서 사용해보자.

curl http://www.netscape.com/

단, 프락시 있다면 프락시 지정하는 방법이 따로 있음.

libcurl 로서의 예제를 봅시다.
http://curl.haxx.se/libcurl/

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

typedef struct mmm {  
    char *memm;  
    size_t size;  
} MemoryStruct;  

void * myrealloc(void *ptr, size_t size)  
{   
    if(ptr)  
        return realloc(ptr,size);  
    else  
        return malloc(size);  
}   

size_t func(void *ptr, size_t size, size_t nmemb, void * stream);  

int main(int argc, char ** argv)  
{   
    FILE *fp;  
    CURL * curl;  
    CURLcode res;  

    MemoryStruct chunk;  

    chunk.memm=NULL;  
    chunk.size=0;  

    curl_global_init(CURL_GLOBAL_ALL);  

    curl = curl_easy_init();  
    if(curl)  
    {  

        printf("url = %s\n", argv[1]);  

        curl_easy_setopt(curl, CURLOPT_PROXY, "http://니 프락시 써라.. ");   
        curl_easy_setopt(curl,CURLOPT_URL,argv[1]);  
        curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,func);  
        curl_easy_setopt(curl,CURLOPT_WRITEDATA,(void *) &chunk);  

        res = curl_easy_perform(curl);  

        curl_easy_cleanup(curl);  

        fp = fopen("ttt.jpg", "wb");  

        fwrite(chunk.memm, 1, chunk.size, fp);  

        fclose(fp);  

        fprintf(stdout,"%s\n",chunk.memm);  
    }  

    if(chunk.memm)  
    {  
        free(chunk.memm);  
        chunk.size=0;  
    }  
    return 0;  
}   

size_t func(void *ptr, size_t size, size_t nmemb, void * stream)  
{   
    size_t realsize=size*nmemb;  
//  fprintf(stdout,"%d %d\n",size,nmemb);  
    MemoryStruct * mem = (MemoryStruct *)stream;  
    mem->memm = (char *)myrealloc(mem->memm, mem->size+realsize+1);  
    if(mem->memm) {  
        memcpy(&(mem->memm[mem->size]), ptr, realsize);  
        mem->size += realsize;  
        mem->memm[mem->size]=0;  
    }  
    return realsize;  
}   

예제 사용법 : simple http://니잘가는주소/니좋아하는사진.jpg

TCP/IP를 쉽게 공부하고 싶다면.
두꺼운 책이 무섭다면.

다음 책을 추천.

TCP/IP 소켓 프로그래밍
Michael J. Donahoo & Kenneth L. Calvert 지음, 박준철 옮김/사이텍미디어(희중당)

https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8955507550&ttbkey=ttbdawnsea1337002©Paper=1

것도 귀찮으면 걍 비제이 문서를 보자.

http://www.beej.us/guide/bgnet/output/html/multipage/index.html









[t:/] is not "technology - root". dawnsea, rss