私はUDPメッセージを受信するだけでなく、ユーザーからの入力も受け取りますが、STDINはまだselectでブロックしています。 FD_CLRを選択する前にstdin fdを実行すると、プログラムは正常に実行され、stdinソケットは常にデータを読み込む準備ができていることを示します。私はそれを時間切れにするために時間のテレビを導入しようとしましたが、これはどちらかのように動作しているように見えません。どこかでソケットを閉じたり、FD_CLRを呼び出すべきですか? 最終結果はブロックされていないSTDINである必要がありますが、現在はブロックされています。 はFD_ISSETは、あなたがそのソケットのバッファにメッセージを持っている場合、指定したファイルディスクリプタはファイルディスクリプタセットの一部である場合、それはtrueを返します1(またはtrue)を返しませんstdinでSelect()をブロックしてもタイムアウトしません
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;
}
'select'呼び出しが返すものを確認しようとしましたか? –
あなたは 'STDIN'がラインバッファであることを知っていますか? –
@SergeyL - ラインバッファリングは、ライブラリまたは端末レベルで行われ、POSIXレイヤーでは行われません。 stdinをバッファなしで読み取ることは可能です。 – Unsigned