go to start L12_09
|home |print view |recent changes |changed December 6, 2009 |
exact
|You are 54.235.20.17 <- set your identity!

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;
}


|home |print view |recent changes |changed December 6, 2009 |
exact
|You are 54.235.20.17 <- set your identity!

L12_09
go to start