selectを使った文がうまくいきません
C言語でselectを使ってチャットサーバを実現したいのですが、うまくいきません。
以下にメッセージの受信と新しいクライアントの受付を処理するループのコードを示します。
以下のコードのif(select(FD_SETSIZE,&rfds,NULL,NULL,&tv)>0) {
...
}
の分岐に入って1回目の処理を行った後、以降のループでメッセージを送ってもこの分岐に入らなくなります。
どなたか原因がわかるかたよろしくお願いします。
while(1){
FD_ZERO(&rfds); /* rfds を空集合に初期化*/
FD_SET(sock,&rfds); /* 接続要求を待つソケット*/
/* クライアントを受け付けたソケット*/
/* 監視する待ち時間を1 秒に設定*/
tv.tv_sec = 1;
tv.tv_usec = 0;
/* 標準入力とソケットからの受信を同時に監視する*/
max = sock;
for(i = 0;i = k ; i++){
if(max > csock[i]){
max = csock[i];
}
}
if(select(FD_SETSIZE,&rfds,NULL,NULL,&tv)>0) {
/* s3 */
if(FD_ISSET(sock,&rfds)){
/* s4 */
/* クライアントの受付*/
clen = sizeof(clt);
if ( ( csock[k] = accept(sock,(struct sockaddr *)&clt,&clen) ) <0 ) {
perror("accept");
exit(2);
}
FD_SET(csock[k],&rfds);
if(k < MAXCLIENTS){
strcpy(jusin,"REQUEST ACCEPTED\n");
write(csock[k],jusin,strlen(jusin));
/* s5 */
read(csock[k],nbuf,sizeof(nbuf));
check = 0;
for(i = 0;i < 5;i++){
for(j = 0; j < 100;j++){
if(name[i][j] != nbuf[j]){
check = 1;
break;
}
if(nbuf[j] == '\n'){
break;
}
}
}
if(check != 1){
strcpy(userkyohi,"USERNAME REJECTED\n");
write(csock[k],userkyohi,strlen(userkyohi));
write(csock[k],nbuf,strlen(nbuf));
close(csock[k]);
}
else{
i = 0;
while(rbuf[i] != '\n'){
name[k][i] = nbuf[i];
i++;
}
name[k][i]= '\n';
strcpy(toroku,"USERNAME REGISTERED\n");
write(csock[k],toroku,sizeof(toroku));
k++;
}
}else{
strcpy(kyohi,"REQUEST REJECTED\n");
write(csock[k],kyohi,strlen(kyohi));
close(csock[k]);
}
}
for(i = 0;i < k;i++){
if(FD_ISSET(csock[i],&rfds)){
read(csock[i],mbuf,sizeof(mbuf));
if(mbuf[0] == 'E'&& mbuf[1]=='O' && mbuf[2] == 'F'){
/* s7 */
for(;i == k ; i++){
csock[i]=csock[i+1];
memset(name[i],0,sizeof(name[i]));
j = 0;
while(name[i+1][j] != '\n'){
name[i][j] = name[i+1][j];
}
}
close(csock[k]);
k--;
}
else{
memset(msg, 0, sizeof(msg));
j = 0;
while(name[i][j] != '\n'){
msg[j] = name[i][j];
j++;
}
msg[j] = ' ';j++;
msg[j] = '>';j++;
l = 0;
while(mbuf[l]!='\0'){
msg[j]= mbuf[l];
j++;
l++;
}
msg[j] = '\0';
for(t = 0; t < k;t++){
write(csock[t],msg,sizeof(msg));
}
}
}
}
}
}
お礼
回答ありがとうございます。(^_^) なるほど。IDをファイル1から一行ずつ読み込んでファイル2とあわせていけばいいのですね。 とてもわかりやすかったです@ レポートなんで、効率とかは気にしません。自信のある人はハッシュクラスタリングを実装しても良い、とか先生は言うけど自信なんてないし(・_・;) このくらいのプログラミングならできるかな・・・? 卒業がかかっているんでホントありがたかったです。 少しいじってみます。わからなくなったらまたお願いします。
補足
ありがとうございました。 なんとかレポートは完成しました。(^_^)/