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 について読んだところによると、複数のスレッドで 1 つのハンドルを使用するのは良くないということです。ここでは、1 つのハンドルがメッセージの送受信を処理します。

だから私の質問はです。libcurlでデータ転送を分割する方法はありますか? 一方のハンドルはデータの送信のみを行い、もう一方のハンドルは受信のみを行います。ハンドルを複製しようとしましたが、元のハンドルでいくつか送信した後、データを受信できませんでした。次に、 readDataInLoop() メソッドもデータを送信するようにデータを送信するフラグを設定しようとしましたが、機能しません (サーバーが何も送信していない場合、curl_easy_recv() が非常に長い間スレッドを保持していると思われます)。libcurl にネイティブのオプションがあるとは思いません (しかし、繰り返しになりますが、私はかなり頭が悪いことがよくあります)。

もちろん、libcurl を使用している限り、どんな良いアイデアも歓迎されます (決定は私のものではありません)。

編集:
最後に、接続コード全体を再構築し、すべてを1つのスレッドに入れました。質問に答える以外の方法で質問を閉じる方法がわからないため (そして、問題は今のところ解決されていますが、実際には私が探していたものではありません)、開いたままにします。あなたがモッズである場合は、これを閉じてください。

4

1 に答える 1

0

これを見てみましょう: http://curl.haxx.se/libcurl/c/libcurl-multi.html cURL api のノンブロッキング実装を提供し、長い待ち時間を避けることができます。非同期メカニズムを自分で実装する必要がありますが、少なくともそれは可能です。

于 2013-01-09T17:43:58.330 に答える