我正在编写一个基于ncurses的聊天程序。起初,我只编写了网络相关的内容(没有使用ncurses),一切都正常工作,但是在添加图形后,我无法使客户端应用程序正常工作。
主要问题是同时从stdin和socket读取。在没有ncurses版本中,我使用了pthread,它能够完美工作。不幸的是,pthread和ncurses似乎不太搭配,因此我不得不寻找另一种解决方案。我认为select()会有用处,但它仅从stdin读取,并完全忽略了socket。
这是整个代码:code 有趣的部分是:
主要问题是同时从stdin和socket读取。在没有ncurses版本中,我使用了pthread,它能够完美工作。不幸的是,pthread和ncurses似乎不太搭配,因此我不得不寻找另一种解决方案。我认为select()会有用处,但它仅从stdin读取,并完全忽略了socket。
这是整个代码:code 有趣的部分是:
char message[1024];
fd_set master;
fd_set read_fds;
FD_ZERO(&master);
FD_ZERO(&read_fds);
FD_SET(0,&master);
FD_SET(s,&master); // s is a socket descriptor
while(true){
read_fds = master;
if (select(2,&read_fds,NULL,NULL,NULL) == -1){
perror("select:");
exit(1);
}
// if there are any data ready to read from the socket
if (FD_ISSET(s, &read_fds)){
n = read(s,buf,max);
buf[n]=0;
if(n<0)
{
printf("Blad odczytu z gniazdka");
exit(1);
}
mvwprintw(output_window,1,1,"%s\n",buf);
}
// if there is something in stdin
if (FD_ISSET(0, &read_fds)){
getstr(message);
move(CURS_Y++,CURS_X);
if (CURS_Y == LINES-2){
CURS_Y = 1;
}
n = write(s,message,strlen(message));
if (n < 0){
perror("writeThread:");
exit(1);
}
}
}
我可能不太了解select()函数的工作原理,或者我不应该调用connect()函数连接套接字。我感到很迷茫,请给予帮助!谢谢。