我已经阅读了墙上的文字,避免全球.这导致了一个显而易见的问题,如何最好地做到这一点?
我显然想用当前的项目来做.目标是让远程PC向已经拥有stdin阅读器的应用程序发送“击键”.我们的想法是让现有的代码检测到没有待处理的击键,然后检查是否有“udp击键”,如果是,则将其填入所以它似乎是键盘输入.微创,不需要在其他人的代码中改装.
所以我拼凑了一个小的UDP套接字阅读器,它使用setup()函数打开并绑定端口,然后在循环中使用service()函数,使用非阻塞select()一次,没有循环,只检查是否有任何东西现在就读.如果是这样,请从套接字读取数据并对其执行某些操作,否则返回0.
// pseudo c char c; setup(); while (1) { c = check_for_keyboard_entry(); if ( c == 0 ) c = service(); handle_keypress( c ); do_a_bunch_of_other_stuff(); }
显而易见的方法是使用一些全局变量来传输两个函数之间的端口,超时,sockaddr等.但是,你应该使用全局,对吗?
如果我在setup()中使用static vars,它们是否可以通过service()例程访问?
我想一个获得malloc-ed并传递的结构会起作用.我应该有一个cleanup()来关闭套接字并释放内存.
记住,这是一个C问题.没有C!
解决方法
您可以将所有信息打包到结构中.结构可以是客户端可见的,也可以是opaque类型. opaque类型可能是更好的选择,因此您可以隐藏复杂类型的数据(封装).
typedef struct { port_t port; timeout_t timeout; sockaddr_t sockaddr; etc_t etc; } my_stuff;
然后通过引用传递它:
void Foo(my_stuff*);
I suppose a struct that gets malloc-ed and passed around would work. I’d ought to have a cleanup() to close the socket and free the memory.
通常,结构并不总是需要malloc.但是,是的,这可能是需要它的情况.