libcurl发送/接收多线程问题

时间:2013-01-09 16:38:49

标签: c++ multithreading pthreads libcurl

所以我加入了一个依赖于服务器 - 客户端套接字通信的项目。我们的想法是不断检查来自服务器的消息,然后处理它们,有时候我自己发送信息。我已收到以下代码:

bool OnlineServerHandler::connectToServer(){
    /* some unrelated code here */
    curl = curl_easy_init();
    if (curl){
        /* some connection options and error checking */
        int threadCode;
        if((threadCode=pthread_create(&networkThread, NULL, OnlineServerHandler::readDataInLoop, NULL))!=0){
            CCLog("Failed to initialize new thread. Code: %d", threadCode);
            curl_easy_cleanup(curl);
            return false;
    }
    /* and more unrelated code here */
}

/* and method called in pthread_create */
void* OnlineServerHandler::readDataInLoop(void* threaddata){
    for(;;){
        if(exitThread) // flag to end the thread
            break;
        char buf[1024];
        wait_on_socket(sockfd, 1, 60000L);
        if(buf!=NULL && strlen(buf)>0)
            memset(&buf, 0, strlen(buf));
        res = curl_easy_recv(curl, buf, 1024, &iolen);
        if(CURLE_OK != res)
             continue;
        /* message processing */
    }
}

问题是,从我读到的关于libcurl的内容来看,在多个线程中使用一个句柄是个坏主意。这里有一个句柄处理消息发送和接收。

所以我的问题是。有没有办法在libcurl中划分数据传输?一个句柄只发送数据,另一个只接收。我尝试复制句柄但是在发送一些原始句柄后我无法接收数据。然后我尝试放置一个标志来发送数据,这样readDataInLoop()方法也会发送数据,但它不起作用(我怀疑如果服务器没有发送任何东西,curl_easy_recv()会保持线程很长时间)。我不认为libcurl中存在本机选项(但话说再说一次,我通常都是脑盲)。

当然,只要它使用libcurl(决定不是我的),任何好主意都会受到欢迎。

编辑:
最后,我重建了整个连接代码并将所有内容放在一个线程中。由于我不知道如何以其他方式解决问题而不是回答问题(虽然问题现在已经解决了,但这并不是我想要的)我会把它打开。如果你是一名模特,请随意关闭。

1 个答案:

答案 0 :(得分:0)

看看这个:http://curl.haxx.se/libcurl/c/libcurl-multi.html它提供了cURL api的非阻塞实现,这将允许您避免长时间等待。您需要自己实现异步机制,但它至少会允许这样做。