Libcurl发送/接收多线程问题

libcurl send/receive multithread issue

本文关键字:多线程 问题 发送 Libcurl      更新时间:2023-10-16

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

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,任何好的想法都是受欢迎的(这不是我的决定)。

编辑:
最后,我重新构建了整个连接代码,并将所有内容放在一个线程中。因为我不知道如何结束这个问题,而不是回答它(虽然问题现在已经解决了,但这并不是我真正想要的),我将把它打开。如果你是mod,可以关闭这个

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