void DialogServer::run() { _ready.set(); Poco::Timespan span(250000); while (!_stop) { if (_socket.poll(span, Socket::SELECT_READ)) { DialogSocket ds = _socket.acceptConnection(); { FastMutex::ScopedLock lock(_mutex); if (!_nextResponses.empty()) { ds.sendMessage(_nextResponses.front()); _nextResponses.erase(_nextResponses.begin()); } } if (_acceptCommands) { try { std::string command; while (ds.receiveMessage(command)) { if (_log) std::cout << ">> " << command << std::endl; { FastMutex::ScopedLock lock(_mutex); _lastCommands.push_back(command); if (!_nextResponses.empty()) { if (_log) std::cout << "<< " << _nextResponses.front() << std::endl; ds.sendMessage(_nextResponses.front()); _nextResponses.erase(_nextResponses.begin()); } } } } catch (Poco::Exception& exc) { std::cerr << "DialogServer: " << exc.displayText() << std::endl; } } } } }
void DialogSocketTest::testDialogSocket() { EchoServer echoServer; DialogSocket ds; ds.connect(SocketAddress("localhost", echoServer.port())); ds.sendMessage("Hello, world!"); std::string str; ds.receiveMessage(str); assert (str == "Hello, world!"); ds.sendString("Hello, World!\n"); ds.receiveMessage(str); assert (str == "Hello, World!"); ds.sendMessage("EHLO", "appinf.com"); ds.receiveMessage(str); assert (str == "EHLO appinf.com"); ds.sendMessage("PUT", "local.txt", "remote.txt"); ds.receiveMessage(str); assert (str == "PUT local.txt remote.txt"); ds.sendMessage("220 Hello, world!"); int status = ds.receiveStatusMessage(str); assert (status == 220); assert (str == "220 Hello, world!"); ds.sendString("220-line1\r\n220 line2\r\n"); status = ds.receiveStatusMessage(str); assert (status == 220); assert (str == "220-line1\n220 line2"); ds.sendString("220-line1\r\nline2\r\n220 line3\r\n"); status = ds.receiveStatusMessage(str); assert (status == 220); assert (str == "220-line1\nline2\n220 line3"); ds.sendMessage("Hello, world!"); status = ds.receiveStatusMessage(str); assert (status == 0); assert (str == "Hello, world!"); }