Verbessere Socket-Validierung und Fehlerbehandlung in ChatUser und Base
- Füge Überprüfungen hinzu, um sicherzustellen, dass der Socket gültig ist, bevor Nachrichten gesendet werden. - Implementiere detaillierte Fehlerprotokollierung für verschiedene Socket-Fehler, um die Diagnose zu erleichtern. - Ergänze eine kurze Verzögerung im ChatRoom, um den Abschluss des WebSocket-Handshakes zu gewährleisten.
This commit is contained in:
@@ -64,9 +64,35 @@ namespace Yc {
|
||||
sendWebSocketMessage(socket, out);
|
||||
return;
|
||||
}
|
||||
|
||||
// Socket-Validierung vor dem Senden
|
||||
if (socket < 0) {
|
||||
#ifdef YC_DEBUG
|
||||
std::cout << "[Debug] Invalid socket (< 0), skipping send" << std::endl;
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
ssize_t result = write(socket, out.c_str(), out.length());
|
||||
if (result < 0) {
|
||||
std::cout << "[Error] Fehler beim Senden auf Socket (vermutlich Verbindung verloren): " << strerror(errno) << std::endl;
|
||||
int error = errno;
|
||||
// Nur kritische Fehler loggen, nicht alle "Bad file descriptor" Fehler
|
||||
if (error == EBADF) {
|
||||
#ifdef YC_DEBUG
|
||||
std::cout << "[Debug] Socket " << socket << " closed by client, skipping send" << std::endl;
|
||||
#endif
|
||||
} else if (error == EPIPE) {
|
||||
#ifdef YC_DEBUG
|
||||
std::cout << "[Debug] Broken pipe on socket " << socket << ", connection closed" << std::endl;
|
||||
#endif
|
||||
} else if (error == ECONNRESET) {
|
||||
#ifdef YC_DEBUG
|
||||
std::cout << "[Debug] Connection reset by peer on socket " << socket << std::endl;
|
||||
#endif
|
||||
} else {
|
||||
// Nur unbekannte Fehler als Error loggen
|
||||
std::cout << "[Error] Fehler beim Senden auf Socket " << socket << ": " << strerror(error) << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +235,14 @@ namespace Yc {
|
||||
}
|
||||
|
||||
void Base::sendWebSocketMessage(int socket, const std::string& out) {
|
||||
// Socket-Validierung vor dem Senden
|
||||
if (socket < 0) {
|
||||
#ifdef YC_DEBUG
|
||||
std::cout << "[Debug] Invalid WebSocket socket (< 0), skipping send" << std::endl;
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
std::string frame;
|
||||
unsigned char hdr[2];
|
||||
hdr[0] = 0x80 | 0x1; // FIN + text
|
||||
@@ -230,7 +264,28 @@ namespace Yc {
|
||||
frame.append(reinterpret_cast<char*>(ext), 8);
|
||||
}
|
||||
frame.append(out);
|
||||
::send(socket, frame.data(), frame.size(), 0);
|
||||
|
||||
ssize_t result = ::send(socket, frame.data(), frame.size(), 0);
|
||||
if (result < 0) {
|
||||
int error = errno;
|
||||
// Nur kritische Fehler loggen, nicht alle "Bad file descriptor" Fehler
|
||||
if (error == EBADF) {
|
||||
#ifdef YC_DEBUG
|
||||
std::cout << "[Debug] WebSocket " << socket << " closed by client, skipping send" << std::endl;
|
||||
#endif
|
||||
} else if (error == EPIPE) {
|
||||
#ifdef YC_DEBUG
|
||||
std::cout << "[Debug] Broken pipe on WebSocket " << socket << ", connection closed" << std::endl;
|
||||
#endif
|
||||
} else if (error == ECONNRESET) {
|
||||
#ifdef YC_DEBUG
|
||||
std::cout << "[Debug] Connection reset by peer on WebSocket " << socket << std::endl;
|
||||
#endif
|
||||
} else {
|
||||
// Nur unbekannte Fehler als Error loggen
|
||||
std::cout << "[Error] Fehler beim Senden auf WebSocket " << socket << ": " << strerror(error) << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Json::Value Base::getJsonTree(const std::string& msg) {
|
||||
|
||||
Reference in New Issue
Block a user