curl multithread 에서 사용시 질문입니다.

park3250의 이미지

curl 라이브러리를 링크하고 있는 AAA라이브러리

class AAA
{
protected:
char m_buf[65536];
unsitned int m_nWriteSize;
}

AAA 라이브러리에서는 멤버 변수를 들고 있으며
멀티스레드 환겨에서 사용하기 위하여

extern "C" size_t AAA::writer( void *source , size_t size , size_t nmemb , void *userData)
{
AAA* pAAA = (AAA*)userData;
if(pAAA == NULL)
return -1;

const int SIZE = size * nmemb;
pAAA->Write((char*)source, SIZE);

return SIZE;
}

int AAA::Write(char* pBuf, int size)
{
-> if(m_nWriteSize+size > M_PKT_DATA)
size = M_PKT_DATA-m_nWriteSize;

memcpy(m_buf+m_nWriteSize, pBuf, size);
m_nWriteSize += size;

return 0;
}

init()
{
g_sharecurl = curl_share_init();

curl_share_setopt(g_sharecurl,CURLSHOPT_LOCKFUNC, lock);
curl_share_setopt(g_sharecurl,CURLSHOPT_UNLOCKFUNC, unlock);
curl_share_setopt(g_sharecurl,CURLSHOPT_SHARE,CURL_LOCK_DATA_SHARE);
curl_share_setopt(g_sharecurl,CURLSHOPT_USERDATA,0);
g_easycurl = curl_easy_init();
if( g_easycurl == NULL )
{
curl_share_cleanup(g_sharecurl);
curl_global_cleanup();
return CERTIFY_ERR_CURL_INIT;
}

curl_easy_setopt(g_easycurl,CURLOPT_SHARE,g_sharecurl);
}

share 함수를 이용하여 lock, unlock 함수를 콜백함수로 등록하였습니다

Send(char* url, char* pBuf)
{
curl_easy_setopt(g_easycurl, CURLOPT_URL, url ) ;// 긁어올 url을 명시하고, url이 URL정보임을 알려준다.
curl_easy_setopt(g_easycurl, CURLOPT_NOPROGRESS , TRUE ) ;// no progress bar:
curl_easy_setopt(g_easycurl, CURLOPT_HEADER , FALSE ) ; //헤더를 받지않겠다.
curl_easy_setopt(g_easycurl, CURLOPT_WRITEDATA , this ) ;// body 데이터는 표준출력 하도록 한다.

curl_easy_setopt(g_easycurl, CURLOPT_WRITEFUNCTION , writer ) ;// body 데이터는 표준출력 하도록 한다.
//curl_easy_setopt(g_easycurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
//curl_easy_setopt(g_easycurl, CURLOPT_WRITEDATA, (void*)&chunk);

curl_easy_setopt(g_easycurl, CURLOPT_FOLLOWLOCATION , TRUE ) ;//위치 헤더가 존재하면 따라간다.
curl_easy_setopt(g_easycurl, CURLOPT_SSL_VERIFYPEER, FALSE);// 인증서 체크같은데 true 시 안되는 경우가 많다.
curl_easy_setopt(g_easycurl, CURLOPT_SSLVERSION,3); // SSL 버젼 (https 접속시에 필요)
curl_easy_setopt(g_easycurl, CURLOPT_TIMEOUT, TIMEOUT); // TimeOut 값

const CURLcode rc = curl_easy_perform( g_easycurl ) ;

if(m_nWriteSize > 0)
{
memcpy(pBuf,m_buf,m_nWriteSize);
m_nWriteSize = 0;
}
}

멀티스레드에서 Send() 호출시 두번째 처리 중 Write() 함수 첫번째 줄에서 브레이크 포인트가 잡힙니다
멀티스레드가 AAA 클래스를 각각 선언하여 사용하고 있구요
lock/unlock 함수에 로그를 넣어봐도 최초 등록시에만 호출이 되고
핸들 사용시 락 함수가 콜백되지 않습니다

그리고 CURLOPT_WRITEFUNCTION 콜백 함수에서 자꾸 죽는데...
원인이 뭘까요? 그리고 멀티스레드 환경에서 어떻게 써야 하는건가요?
답변 부탁드리겟습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.