C++:使用select()
我正在构建一个客户机,它可以从服务器和用户stdin接收信息,所以我使用select来监视这两个。发生的情况是,当我向客户端发送消息并返回消息时,键盘输入被监控,没有问题。但是当服务器发送消息时,什么也没有发生,我也不知道为什么。使用select是否是正确的方法 这是我的密码:C++:使用select(),c++,sockets,select,C++,Sockets,Select,我正在构建一个客户机,它可以从服务器和用户stdin接收信息,所以我使用select来监视这两个。发生的情况是,当我向客户端发送消息并返回消息时,键盘输入被监控,没有问题。但是当服务器发送消息时,什么也没有发生,我也不知道为什么。使用select是否是正确的方法 这是我的密码: void readSocket(fd_set tempfd) { const char * tweet, * inMessage; if (FD_ISSET(srverfd,&tempfd)) {
void readSocket(fd_set tempfd) {
const char * tweet, * inMessage;
if (FD_ISSET(srverfd,&tempfd)) {
inMessage = getMessage();
printSystemMessages(inMessage);
}
if (FD_ISSET(STDIN_FILENO,&tempfd)) {
tweet = getUserTweet();
sendMessage(tweet);
inMessage = getMessage();
if (strcmp(inMessage,OK) != 0) {
printSystemMessages(inMessage);
}
if (strcmp(inMessage,EXIT) == 0) {
return;
}
}
return;
}
int main (int argc, char *argv[] ){
int value;
bool clientON = false;
fd_set tempfd;
if(establishConnection(argv[2],argv[3])){
cerr << "usage: failed to make connection" << endl << "exiting..." << endl;
exit(EXIT_FAILURE);
}
cout << "Connected successfully" << endl;
sendMessage("CONNECT "+clientName); //Connect
if(strcmp(getMessage(),OK) == 0){
build_select_list();
printSystemMessages("Welcome!");
clientON = true;
cout<< man <<endl;
}
while(clientON){
tempfd = inputFdSet;
printTweetFormat("TweetMy:");
value = select(maxSock, &tempfd, NULL, NULL, NULL);
if (value < 0) {
perror("select");
exit(EXIT_FAILURE);
}
if (value == 0) {
continue;
}
else {
readSocket(tempfd);
}
}
close(srverfd);
return 0;
}
这可能会帮助您-将maxSock+1而不是maxSock传递给select调用 从手册页中选择
nfds is the highest-numbered file descriptor in any of the three sets,
plus 1.
这可能会帮助您-将maxSock+1而不是maxSock传递给select调用 从手册页中选择
nfds is the highest-numbered file descriptor in any of the three sets,
plus 1.
关于select的用法,您可以参考。您有上面的两个主要功能-您可以真正清理这些功能,使事情更清楚,然后更有可能获得answer@curiousbill-我读了好几遍,都找不到答案。你的例子甚至没有编译。。。如果没有代码,任何人怎么能发现错误。除非客户机请求数据,否则通常不会从服务器接收数据。您是说服务器正在向客户机写入数据,而客户机没有发出请求吗?服务器通常使用listen和accept来执行此操作。客户端通常在等待请求答复时只读。有关select的用法,请参阅。您有两个以上的主要功能-您可以真正清理这些功能,使事情更清楚,然后更有可能获得answer@curiousbill-我读了好几遍,都找不到答案。你的例子甚至没有编译。。。如果没有代码,任何人怎么能发现错误。除非客户机请求数据,否则通常不会从服务器接收数据。您是说服务器正在向客户机写入数据,而客户机没有发出请求吗?服务器通常使用listen和accept来执行此操作。客户机通常在等待请求的答复时只读。这是一个很好的观点。但是,由于maxSock没有在这个代码段的任何地方定义,因此您永远无法知道它是否已经包含+1:@EitanT-确实如此-这就是为什么我说这可能会有所帮助:这是一个非常好的观点。但是,由于maxSock没有在这个代码段中的任何地方定义,因此您永远无法知道它是否已经包含+1:@EitanT-确实如此-这就是为什么我说这可能会有所帮助: