2011-10-07 32 views
1

我对C设计模式不是很熟悉,并且为以下问题寻找最佳解决方案。我想写一个基于libpurple的小聊天客户端。在C中动态帐户连接的最佳解决方案?

运行程序时,我想能够连接和断开多个即时消息帐户。 connect和disconnect调用应该通过命令行传递,但是用gets()等待输入。是无法解决的,因为程序应该始终运行从已经连接的即时消息帐户获取新消息。

回答

2

您可能想要使用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,它看起来会有点不同,但原理是一样的。

0

退房选择(2)。我不确定libpurple是如何工作的,但如果它允许通过文件描述符(如文件或套接字)进行通知,那么选择是您的解决方案。

你也可以尝试用pthread_create(3)创建一个单独的线程。这样它可以阻止获取(或其他),而你的程序的其余部分就是这样。