Ich muss etwas falsch machen bei der Einrichtung select()
und write_fds
. Momentan, wenn ich sendData()
rufe, sendet es zum ersten Mal 117 Bytes (alles) aus dem Puffer. Dann wird es sofort wieder aufgerufen, auch wenn es keine Daten mehr gibt, die in den Puffer gesendet werden, und es ruft für immer sendData()
an.Einrichten von Select() und Write_fds in C
Irgendeine Idee, was ich hier falsch mache?
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);
}
}
}
}
Umm, stoppe den Aufruf von Code, den Sie nicht genannt wollen. –
Es hat keinen Sinn, 'FD_ZERO' direkt aufzurufen, bevor Sie den gleichen fd-Satz von' master' überschreiben. – Barmar
@Barmar Vielen Dank, dass Sie darauf hingewiesen haben. –