我对C设计模式不是很熟悉,并且为以下问题寻找最佳解决方案。我想写一个基于libpurple的小聊天客户端。在C中动态帐户连接的最佳解决方案?
运行程序时,我想能够连接和断开多个即时消息帐户。 connect和disconnect调用应该通过命令行传递,但是用gets()等待输入。是无法解决的,因为程序应该始终运行从已经连接的即时消息帐户获取新消息。
我对C设计模式不是很熟悉,并且为以下问题寻找最佳解决方案。我想写一个基于libpurple的小聊天客户端。在C中动态帐户连接的最佳解决方案?
运行程序时,我想能够连接和断开多个即时消息帐户。 connect和disconnect调用应该通过命令行传递,但是用gets()等待输入。是无法解决的,因为程序应该始终运行从已经连接的即时消息帐户获取新消息。
您可能想要使用poll
(或select
)来处理事件。因此,在建立连接之后,您将拥有文件描述符,此外还有标准输入,它还具有来自操作系统的文件描述符(即0),并且您可以将所有这些文件描述符传递给poll
,这会通知您何时任何文件描述符都有传入数据。示例代码:
/* fd1, fd2 are sockets */
while(1) {
pollfd fds[3];
int ret;
fds[0].fd = fd1;
fds[1].fd = fd2;
fds[2].fd = STDIN_FILENO;
fds[0].events = POLLIN;
fds[1].events = POLLIN;
fds[2].events = POLLIN;
ret = poll(fds, 3, -1); /* poll() blocks, but you can set a timeout here */
if(ret < 0) {
perror("poll");
}
else if(ret == 0) {
printf("timeout\n");
}
else {
if(fds[0].revents & POLLIN) {
/* incoming data from fd1 */
}
if(fds[0].revents & (POLLERR | POLLNVAL)) {
/* error on fd1 */
}
if(fds[1].revents & POLLIN) {
/* incoming data from fd2 */
}
if(fds[1].revents & (POLLERR | POLLNVAL)) {
/* error on fd2 */
}
if(fds[2].revents & POLLIN) {
/* incoming data from stdin */
char buf[1024];
int bytes_read = read(STDIN_FILENO, buf, 1024);
/* handle input, which is stored in buf */
}
}
}
您没有提及操作系统。这适用于POSIX(OS X,Linux,Windows和mingw)。如果您需要使用Win32 API,它看起来会有点不同,但原理是一样的。
退房选择(2)。我不确定libpurple是如何工作的,但如果它允许通过文件描述符(如文件或套接字)进行通知,那么选择是您的解决方案。
你也可以尝试用pthread_create(3)创建一个单独的线程。这样它可以阻止获取(或其他),而你的程序的其余部分就是这样。