/* This is a workaround for the case when session layer starts reading * the socket before the client actualy sends the data */ static clib_error_t * sapi_socket_receive_wait (clib_socket_t *cs, u8 *msg, u32 msg_len) { clib_error_t *err; int n_tries = 5; while (1) { err = clib_socket_recvmsg (cs, msg, msg_len, 0, 0); if (!err) break; if (!n_tries) return err; n_tries--; usleep (1); } return err; }
时间: 2024-04-17 19:29:43 浏览: 131
EE.rar_On The Run
这段代码是一个用于解决在会话层开始读取套接字之前客户端实际发送数据的情况的工作around(解决方法)。
该函数名为 `sapi_socket_receive_wait`,接受一个 `clib_socket_t` 类型的指针 `cs`,以及一个 `u8` 类型的指针 `msg` 和一个 `u32` 类型的 `msg_len` 作为参数。
函数使用了一个循环来等待接收数据,循环的条件为 `while (1)`,表示一直进行循环,直到满足某个条件才跳出循环。
在循环中,首先调用 `clib_socket_recvmsg` 函数来接收套接字上的消息,并将结果赋值给 `err`。如果接收成功,即 `err` 为 `NULL`,则跳出循环。
如果接收失败,则判断剩余尝试次数 `n_tries` 是否为零。如果为零,则直接返回错误 `err`。
如果剩余尝试次数不为零,则将 `n_tries` 减一,并调用 `usleep` 函数进行微小的延迟。
最后,返回错误 `err`。
综上所述,这段代码是一个循环等待接收套接字上的消息的函数,用于解决在会话层开始读取套接字之前客户端实际发送数据的情况。它通过多次尝试接收消息,并使用微小的延迟来等待数据的到达。
阅读全文