Отправка данных с помощью libevent работает иногда

При разработке очень часто вещи работают или не работают. При отправке данных с моего клиента на мой сервер это не всегда работает, но в большинстве случаев работает. Я предполагаю, что, вероятно, ядро ​​не отправляет сохраненный буфер. В любом случае, должен быть способ обойти это поведение.

Мой клиент имеет графический интерфейс, и он должен общаться с сервером. Поскольку потоки не работают так, как я хочу, я решил использовать event_base_loop так что он просто блокируется, пока не будет обработан один пакет. После этого он может выполнять работу с графическим интерфейсом, чтобы окно не зависало.

Я очень уверен, что моя отправка не удалась, а НЕ мое чтение, потому что мой сервер не вызывает мой обратный вызов для чтения («readcb»).

Прикрепленная функция, которую я вызываю из main функционировать так:

int main(int argc, char **argv)
{
// init stuff
// connnect to server
sendPacket(bev);
}

Я много об этом исследовал, но ничего не нахожу. Например bufferevent_flush(bev, EV_WRITE, BEV_FLUSH) не работает с сокетами (я попробовал это даже).

Моя текущая функция для записи (в краткой форме, упрощенная для одного пакета):

void sendPacket(bufferevent * bev)
{
// just data:
const unsigned int msg_ = 12;
char msg[msg_] = "01234567891";
// send that packet:
uint16_t packet_id = 1
bufferevent_write(bev, &packet_id, 2);
bufferevent_write(bev, msg, msg_);
//and this part SHOULD make that data really send but it does not every time:
while (evbuffer_get_length(bufferevent_get_output(bev)) > 0)
{
event_base_loop(bufferevent_get_base(bev), EVLOOP_ONCE);
};
//this last one, only to be really sure (that's why i use the second option):
event_base_loop(bufferevent_get_base(bev), EVLOOP_NONBLOCK | EVLOOP_ONCE);
}

Спасибо за ваше время, я был бы потерян без вашей помощи.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]