如何在libuv中等待更多数据?

时间:2016-07-24 17:16:35

标签: libuv

我正在测试服务器的libuv。

问题是数据部分到达,我需要等待更多数据。 (这种情况尚未发生,但根据我的经验,我认为它即将到来)

但是这个libuv依赖于事件库,接下来是after_read()函数 并不保证下一个数据包将是剩余的。

我想知道你是如何解决的。 谢谢。

添加了更多信息。 我关心分裂包的情况。

  • 假设客户端A,客户端B,服务器S.

    1. A向服务器发送100个字节。
    2. B向服务器发送100个字节。
    3. S收到A的前50个字节。 (在阅读回调中)
    4. S接收B的100个字节。 (在阅读回调中)
    5. S收到A的剩余50个字节。 (在阅读回调中)

在第3步之后,我预计其余A的50字节到达,但与我的期望不同,B的100字节到达。我的目标是为A的整个数据合并第3步(50字节)+第5步(50字节)。

2 个答案:

答案 0 :(得分:3)

在libuv中,您不等待数据,您通过调用uv_read_start请求读取数据,然后在有数据要读取时调用读回调。如果您的应用程序需要读取完整的数据包,您通常希望使用状态机来了解您所处的状态,并在您拥有完整数据包之前保持缓冲数据。

答案 1 :(得分:1)

要处理此问题,只需使用您需要的任何连接特定信息创建自己的派生tcp类型。

typedef struct
{
  uv_tcp_t base;
  int idx;
} my_tcp_t;

然后malloc你的结构并投射它

my_tcp_t *client = (my_tcp_t*) malloc(sizeof(my_tcp_t));
client->idx = 2;
uv_tcp_init(loop, (uv_tcp_t*)client);

通过强制转换(my_tcp_t *),可以在read回调中使用idx变量。