select()
とwrite_fds
を設定する際に何か間違っている必要があります。現在、sendData()
を呼び出すと、初めてバッファから117バイト(すべて)が送信されます。それからすぐにそれはバッファに送信するデータがなくても、もう一度呼び出され、sendData()
は永遠に呼び出し続けます。Cでselect()とwrite_fdsを設定する
私がここで間違っているのは何ですか?
int readData(int j){
return recv(j, buf , nbytes , 0);
}
int sendData(int j){
unsigned v = fcntl(j, F_GETFL, 0);
fcntl(j, F_SETFL, v | O_NONBLOCK);
return send(j, buf, nbytes, 0);
}
fd_set master;
fd_set read_fds;
fd_set write_fds;
int fdmax;
...
FD_ZERO(&master);
FD_SET(socket, &master);
fdmax = socket;
for(;;){
FD_ZERO(&read_fds);
FD_ZERO(&write_fds);
read_fds = master;
write_fds = master;
if(select(fdmax+1, &read_fds, &write_fds, NULL, NULL) == -1){
exit(4);
}
for(i = 0; i <= fdmax; i++){
if(FD_ISSET(i, &read_fds)){
if(i == socket){
// handle new connections
addrlen = sizeof remoteaddr;
newfd = accept(socket, (struct sockaddr *)&addr, &addrlen);
FD_SET(newfd, &master);
if(newfd > fdmax) fdmax = newfd;
}else{
// we got some data from a client
readData(i);
}
} else if(FD_ISSET(i, &write_fds)){
if(i != socket){
// send data when notified
sendData(i);
}
}
}
}
ええと、呼びたくないコードを停止してください。 –
'master'から同じfdセットを上書きする直前に、' FD_ZERO'を呼び出すことに意味がありません。 – Barmar
@Barmarこれを指摘してくれてありがとう。 –