Libcurl发送/接收多线程问题
libcurl send/receive multithread issue
所以我加入了一个依赖于服务器-客户端套接字通信的项目。这个想法是不断检查来自服务器的消息,然后处理它们,而有时我自己发送信息。我看到了下面的代码:
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的非阻塞实现,这将允许您避免长时间等待。您将需要自己实现异步机制,但它至少允许这样做。
相关文章:
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- C++多线程生产者-消费者问题
- C++ 多线程中的锁和条件变量问题
- 多线程与线程小问题
- 多线程概念问题
- 在 Linux 中从单独的单线程进程生成多线程进程时出现问题
- 如何解决多线程绘图的问题不流畅
- C++ std::endl 的多线程程序 I/O 问题
- 我遇到了一个关于多线程的小问题.需要多线程来计算 Pi 和方差
- gdal多线程问题
- C++11 多线程问题
- boost::d ynamic_bitset 多线程问题
- Android 的 c++11 多线程问题,其中某些线程未正确调度
- i7处理器和windows8操作系统上的多线程问题
- Poco::ServerApplication的多线程问题
- New和delete处理多线程问题
- 如何在c++中避免多线程问题(wxWidgets和Cplex)
- C++多线程问题
- Libcurl发送/接收多线程问题