Also baue ich einen Chat-Server, jetzt versuche ich, alle Nachrichten vom Client zu echo. Momentan, sobald ich die Nachricht bekomme, sende ich sie innerhalb readData()
zurück. Aber sobald ich es senden, benachrichtigt select()
die write_fds
und sendData()
genannt wird, auch schon ich send()
genanntOrdnungsgemäße Methode zum Senden von Daten bei Verwendung von select() und write_fds in C
Die meisten meiner Anrufe Daten innerhalb des readData()
wäre zu senden.
- Ist dies der richtige Weg
select()
undwrite_fds
zu verwenden? - Wie kann ich
select()
benachrichtigen, dass ich Daten ohne zwei Anrufe ansend()
senden möchte?
Es scheint redundant zu mir mit zwei Anrufe zu send()
zu beschäftigen.
int readData(int j){
// get message from the client
recv(j, client_buffer , 6000 , 0);
// echo message to the client
send(j, client_buffer, strlen(client_buffer));
}
int sendData(int j){
send(j, buf, nbytes, 0);
}
for(;;){
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 == listener){
// handle new connections
addrlen = sizeof remoteaddr;
newfd = accept(listener, (struct sockaddr *)&addr, &addrlen);
FD_SET(newfd, &master);
if(newfd > fdmax) fdmax = newfd;
}else{
// we got some data from a client
readData(i);
}
}
if(FD_ISSET(i, &write_fds)){
if(i != listener){
// send data when notified
sendData(i);
}
}
}
}
1) (hier TCP vorausgesetzt) send() und recv haben einen Rückgabewert. benutze es. Und beschäftigen Sie sich mit partiellen Lese-/Schreibvorgängen. 2) Sie können strlen() im Puffer nach dem Empfang nicht verwenden, da es nicht unbedingt NUL-terminiert ist. 3) Eine -1 Rückkehr von send/recv/select ist nicht immer ein Fehler. Es könnte sich um einen unterbrochenen Systemaufruf, einen EWOULDBLOCK oder auch um einen Out-of-Resource-Zustand handeln. 4) nach dem accept() möchten Sie wahrscheinlich das new_fd zu den gelesenen fd_fds hinzufügen. – wildplasser
'TCP', das ist richtig. Danke, dass Sie das 'strlen()' hervorgehoben haben. Über den Rückgabewert, also sagst du, dass es immer zwei Aufrufe von 'send()' geben wird, aber ich muss nur verfolgen, wie viele Daten der erste Anruf gesendet hat und den Rest im zweiten oder dritten Anruf senden? –
Ich habe nur auf die offensichtlichen Fehler hingewiesen. IMHO wird es niemals einen 2. oder 3. Aufruf geben, da das neue fd nicht im write fd_set ist und auch nicht im read_set. (beide sind Kopien des Master-Sets) – wildplasser