0

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

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,任何好主意都会受到欢迎(决定不是我的)。

编辑:
最后我重建了整个连接代码并将所有内容放在一个线程中。由于除了回答问题之外,我不知道如何关闭问题(虽然问题现在已经解决,但它并不是我真正想要的),我将保持打开状态。如果你是一个模组,请随意关闭它。

4

1 回答 1

0

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

于 2013-01-09T17:43:58.330 回答