libcurl посылают/получают проблему мультинити

Таким образом, я присоединился к проекту, который является в зависимости от коммуникации гнезда клиента сервера. Идея к проверке continuosly на сообщения от сервера, и затем обращайтесь с ними, иногда посылая информацию самостоятельно. Мне подарили следующий код:

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 (решение не мое).

Править:
В конце я восстановил целый код связи и поместил все в одну нить. Так как я не знаю, как закрыть вопрос другой путь, чем ответ на него (и в то время как проблема решена на данный момент, это не действительно, что я искал), я оставлю его открытым. Не стесняйтесь закрывать это, если вы - модник.

0
nl ja de
Смотрит на меня как этот код, основан на этом: curl.haxx.se/libcurl/c/multithread.html - мой пункт, являющийся тем мультипронизыванием isn' t запрещенный ЗАВИТКОМ просто необходимо быть осторожными. Я didn' t видят ваш вопрос в основании - просто читающий это теперь
добавлено автор Caribou, источник

1 ответы

Смотрите на это: http://curl.haxx.se/libcurl/c/libcurl-multi.html это обеспечивает не внедрение блокирования API ЗАВИТКА, который позволит вам избегать долгого ожидания. Необходимо будет осуществить асинхронный механизм сами, но он позволит это, по крайней мере.

0
добавлено
Вероятно, более безопасный:)
добавлено автор Caribou, источник
Я don' t думают, позволит то, что я хочу. В конце я восстановил целый код связи и поместил все в одну нить.
добавлено автор Kegluneq, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest