Я делаю сетевой сервер на C и пытаюсь определить обработчики пакетов как можно более общими.
Когда я получаю завершенный пакет, я хочу создать структуру и отправить ее определенному обработчику.
struct handler {
char *msg_name;
void (*handler)(network_client *, void *msg).
}
//global variable containing all handlers
struct handler const handlers[] = {
{"hello_msg", &helloMessageHandler}
};
struct hello_message_s {
int foo;
char *bar;
float foobar;
}
//called when received hello_cmd and deserialized hello_message_s bytes received by the network
void helloMessageHandler(network_client *c, void *msg) {
struct hello_message_s *casted = msg;
casted->foo; //etc..
}
У меня вопрос;Есть ли способ указать структуру сообщения напрямую, а не void *, заставляя меня приводить позже?т.е. изменить void helloMessageHandler(network_client *c, void *msg)
на void helloMessageHandler(network_client *c, struct hello_message_s *msg)
.
Это невозможно, поскольку обработчики [] могут содержать обработчики только с void *
.
struct handler const handlers[] = {
{"hello_msg", &helloMessageHandler}
};
Любое решение?