我對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)創建一個單獨的線程。這樣它可以阻止獲取(或其他),而你的程序的其餘部分就是這樣。