所以我加入了一個取決於服務器 - 客戶端套接字通信的項目。這個想法是連續檢查來自服務器的消息,然後處理它們,同時有時自己發送信息。我一直呈現以下代碼: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,隨時關閉這個。
在我看來,代碼是基於這個:http://curl.haxx.se/libcurl/c/multithread.html - 我的觀點是多線程不被cURL禁止,你只需要小心。我在底部看不到你的問題 - 現在就讀這個 – Caribou