|
L12_09
|
tjutzi: Unter Windows (mittels Telnet) funktioniert der Chat nicht richtig, da Telnet bereits beim Tippen eines Zeichens dieses an den Chat-Server sendet. Damit der Chat Server brauchbar(er) wird muss lediglich ein Lesepuffer implementiert werden. Dazu muss folgendes gemacht werden:
ChatHandler.h: (hinzufügen)
std::string readBuffer; //Windows-Telnet-Read-Buffer
ChatHandler.cpp: (modifizieren)
Konstruktor
ChatHandler::ChatHandler(int fildes, Reactor &theReactor)
:EchoHandler(fildes,theReactor), readBuffer("")
Funktion "handleReadEvent()" erweitert mit readBuffer
bool ChatHandler::handleReadEvent()
{
char buf[READSIZE];
int readBytes=read(getFd(),buf,READSIZE);
if (readBytes <0) {
cerr << "error reading:"<<strerror(errno)<<endl;
eofInput=true;
return true;
}
if (readBytes == 0 || buf[0] == '.' && islf(buf[1])) {
eofInput=true;
shutdown(getFd(),SHUT_RD);
cerr << "eof reached on read from "<< nickname<<endl;
string msg("Good Bye ");
msg += nickname + "\n";
writeToAll(msg.data(),msg.length());
}
else
{
bool lineEnded = false;
for (int i=0; i<readBytes; i++) {
readBuffer += buf[i];
if (islf(buf[i]))
lineEnded = true;
}
if (lineEnded) {
string msg;
if (nickname.length() == 0) {
setTrimmedNickname(readBuffer.c_str(),readBuffer.size());
msg = "hello " + nickname + "!\n";
msg += getAllNickNames();
cerr << nickname << " connected to chat" <<endl;
writen(msg.data(),msg.length());
msg = nickname +" enters chat\n";
} else {
msg = nickname +":";
msg.append(readBuffer.c_str(),readBuffer.size());
}
readBuffer = "";
writeToAll(msg.data(),msg.length());
}
}
return false;
}
|
L12_09 |
|