Tôi đang viết chương trình nhận tin nhắn UDP cũng như nhận dữ liệu từ người dùng tuy nhiên STDIN của tôi vẫn đang chặn với lựa chọn. Khi tôi FD_CLR fdin fd trước khi chọn chương trình chạy tốt, chỉ ra rằng ổ cắm stdin luôn sẵn sàng để có dữ liệu đọc từ nó. Tôi đã cố gắng giới thiệu một tv thời gian để thời gian nó ra nhưng điều này không xuất hiện để được làm việc, hoặc. Tôi có nên đóng socket ở đâu đó hay gọi FD_CLR ở đâu không? Kết quả cuối cùng phải là STDIN không chặn nhưng hiện tại nó bị chặn. cảm ơnChọn() chặn trên stdin, sẽ không hết thời gian
int
wait_for_input(){
fd_set fds;
int maxfd, sd, err, n;
struct sockaddr_in addr;
char stdbuf[BUFLEN];
unsigned char udpbuf[BUFLEN];
//memset(stdbuf,0x0,sizeof(stdbuf));
memset(stdbuf,0x0,sizeof(udpbuf));
sd = socket(AF_INET, SOCK_DGRAM, 0);
if(sd<0) {
printf("Failed to Open UDP socket");
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(host_list[0]->port);
err = bind(sd,(struct sockaddr *) &addr,sizeof(addr));
if(err < 0){
printf("ERROR: Cant bind port");
}
struct timeval tv;
while(1){
FD_ZERO(&fds);
FD_SET(STDIN_FILENO,&fds);
FD_SET(sd,&fds);
tv.tv_sec = 1;
tv.tv_usec = 0;
fflush(stdout);
select(sd+1,&fds,NULL,NULL,&tv);
// If a UDP message arrives
if(FD_ISSET(sd,&fds)){
n = recv(sd,udpbuf,sizeof(udpbuf),0);
unpack(udpbuf);
recompute_my_dv();
fflush(stdout);
}
//If console data is entered.
if(FD_ISSET(STDIN_FILENO, &fds)){
fgets(stdbuf,sizeof(stdbuf),stdin);
parse(stdbuf);
printf("server> ");
fflush(stdout);
FD_CLR(STDIN_FILENO,&fds);
}
}
return 0;
}
Bạn đã thử kiểm tra xem lệnh gọi 'select' có trả về không? –
Bạn có biết rằng 'STDIN' là dòng đệm không? –
@SergeyL - Việc tạo đường kẻ được thực hiện ở thư viện hoặc cấp thiết bị đầu cuối, không phải ở lớp POSIX. Có thể đọc stdin theo cách không bị cản trở. – Unsigned