При разработке очень часто вещи работают или не работают. При отправке данных с моего клиента на мой сервер это не всегда работает, но в большинстве случаев работает. Я предполагаю, что, вероятно, ядро не отправляет сохраненный буфер. В любом случае, должен быть способ обойти это поведение.
Мой клиент имеет графический интерфейс, и он должен общаться с сервером. Поскольку потоки не работают так, как я хочу, я решил использовать 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);
}
Спасибо за ваше время, я был бы потерян без вашей помощи.
Задача ещё не решена.
Других решений пока нет …