如何在 libuv 中等待更多数据?
How to wait for more data in libuv?
我正在为服务器测试 libuv。
问题是部分数据到达,我需要等待更多数据。
(这种情况还没有发生,但根据我的经验,我认为它指日可待)
但是这个libuv是依赖事件库的,下一个after_read()函数
不保证下一个数据包就是剩余的。
我想知道你是如何工作的。
谢谢。
已添加以获取更多信息。
我关心的分包情况
假设客户端A、客户端B、服务器S。
- A 向服务器发送 100 个字节。
- B 向服务器发送 100 个字节。
- S 收到 A 的前 50 个字节。 (在读取回调中)
- S收到B的100个字节。 (在读取回调中)
- S收到A的剩余50字节。 (在读取回调中)
在第 3 步之后,我预计 A 的其余 50 字节会到达,但与我的预期不同,B 的 100 字节会到达。我的目标是合并 A 的整个数据的第 3 步(50 字节)+ 第 5 步(50 字节)。
libuv不等待数据,调用uv_read_start
请求读取数据,有数据读取时调用read回调。如果您的应用程序需要读取完整的数据包,您通常希望使用状态机来了解您所处的状态,并保持缓冲数据直到您拥有完整的数据包。
要处理这个问题,只需使用您需要的任何连接特定信息创建您自己的派生 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);
idx 变量在读取回调中可以通过强制转换 (my_tcp_t*) 获得。
我正在为服务器测试 libuv。
问题是部分数据到达,我需要等待更多数据。 (这种情况还没有发生,但根据我的经验,我认为它指日可待)
但是这个libuv是依赖事件库的,下一个after_read()函数 不保证下一个数据包就是剩余的。
我想知道你是如何工作的。 谢谢。
已添加以获取更多信息。 我关心的分包情况
假设客户端A、客户端B、服务器S。
- A 向服务器发送 100 个字节。
- B 向服务器发送 100 个字节。
- S 收到 A 的前 50 个字节。 (在读取回调中)
- S收到B的100个字节。 (在读取回调中)
- S收到A的剩余50字节。 (在读取回调中)
在第 3 步之后,我预计 A 的其余 50 字节会到达,但与我的预期不同,B 的 100 字节会到达。我的目标是合并 A 的整个数据的第 3 步(50 字节)+ 第 5 步(50 字节)。
libuv不等待数据,调用uv_read_start
请求读取数据,有数据读取时调用read回调。如果您的应用程序需要读取完整的数据包,您通常希望使用状态机来了解您所处的状态,并保持缓冲数据直到您拥有完整的数据包。
要处理这个问题,只需使用您需要的任何连接特定信息创建您自己的派生 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);
idx 变量在读取回调中可以通过强制转换 (my_tcp_t*) 获得。