所以我加入了一个依赖服务器-客户端套接字通信的项目。这个想法是不断检查来自服务器的消息,然后处理它们,同时有时我自己发送信息。我收到了以下代码:
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,任何好主意都会受到欢迎(决定不是我的)。
编辑:
最后我重建了整个连接代码并将所有内容放在一个线程中。由于除了回答问题之外,我不知道如何关闭问题(虽然问题现在已经解决,但它并不是我真正想要的),我将保持打开状态。如果你是一个模组,请随意关闭它。