虽然开发它很常见,但事情是有效的,或者它们没有。从我的客户端向我的服务器发送数据时,它不是每次都能正常工作,但在大多数情况下确实如此。我猜可能内核不会发送它存储的缓冲区。无论如何,必须有一种方法来解决这种行为。
我的客户端有一个GUI,它必须与服务器通信。因为线程不能按我的意愿工作,所以我决定使用event_base_loop
,这样它就会阻塞,直到处理完一个包。之后它可以做GUI的东西,这样窗口就不会冻结。
我非常肯定我的发送失败而不是我的阅读因为我的服务器没有调用我的回调阅读(“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);
}
感谢您的时间,没有您的帮助,我会迷失方向。