2013-01-09 67 views
0

所以我加入了一個取決於服務器 - 客戶端套接字通信的項目。這個想法是連續檢查來自服務器的消息,然後處理它們,同時有時自己發送信息。我一直呈現以下代碼: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(決定不是我的),任何好主意都會受到歡迎。

編輯:
最後,我重建了整個連接代碼,並將所有內容放在一個線程中。因爲我不知道如何以回答這個問題的方式來解決問題(而問題現在已經解決了,這不是我真正想要的),我會把它打開。如果你是一個mod,隨時關閉這個。

+0

在我看來,代碼是基於這個:http://curl.haxx.se/libcurl/c/multithread.html - 我的觀點是多線程不被cURL禁止,你只需要小心。我在底部看不到你的問題 - 現在就讀這個 – Caribou

回答

0

看看這個:http://curl.haxx.se/libcurl/c/libcurl-multi.html它提供了一個非阻塞實現的cURL api,它可以讓你避免長時間的等待。你需要自己實現異步機制,但至少可以這樣做。

+0

我不認爲會允許我想要的。最後,我重建了整個連接代碼,並將所有內容放在一個線程中。 – Kegluneq

+0

可能更安全:) – Caribou