Это не реальный вопрос для игроков языка C и экспертов по сетевому программированию, но я хотел бы начать обсуждение того, как работать со структурой, содержащей базовые c компоненты libuv, такие как uv_tcp_client или что-то еще.
Позвольте мне привести более подробный сценарий, чтобы начать наше обсуждение. uv_read_start - это функция, которую мы используем для чтения из потока, связывающегося с сервером. Третий аргумент - указатель на функцию, подготовленную после операции чтения. Прототип этой функции выглядит так:
void uv_read_start(uv_stream_t*, alloc_buf_function, after_read_function)
void after_read_function(uv_stream_t*, ssize_t nread,const uv_buf_t* buf)
В after_read_function, если nread <0, что означает, что произошла какая-то ошибка, и мы должны освободить uv_stream_t *. Пока что мы в порядке, если вы используете только переменную из libuv. </p>
Но если вы установите пользовательскую структуру, содержащую uv_stream_t *, ситуация может стать запутанной.
typedef struct
{
uv_stream_t* tcp_client;
...
} client;
....
client* cli = malloc(sizeof(client));
uv_read_start(cli->tcp_client, alloc_buf_function, after_read_function);
....
void after_read_function(uv_stream_t* tcp_client, ssize_t nread, const uv_buf_t* buf){
if (nread < 0) {
// error take place
// we should not only free tcp_client, but also the client struct we malloc outside.
// However, this function is a callback one and type of arguments has been determinated
// in libuv source code and I can't bring client into this function.
}
}
Итак, любой может помочь с этой проблемой?
Заранее спасибо.