Tweaked (default) output verbosity levels to be more sensible and less spammy.

This commit is contained in:
Thulinma 2013-03-12 02:01:57 +01:00
parent 58847705eb
commit 0e02766e2b
8 changed files with 64 additions and 124 deletions

View file

@ -53,7 +53,7 @@ namespace Buffer {
void handleUser(void * v_usr){
user * usr = (user*)v_usr;
#if DEBUG >= 4
#if DEBUG >= 5
std::cerr << "Thread launched for user " << usr->MyStr << ", socket number " << usr->S.getSocket() << std::endl;
#endif

View file

@ -90,24 +90,28 @@ namespace Connector_HTTP {
}
/// Handles requests without associated handler, displaying a nice friendly error message.
void Handle_None(HTTP::Parser & H, Socket::Connection * conn){
long long int Handle_None(HTTP::Parser & H, Socket::Connection * conn){
H.Clean();
H.SetHeader("Server", "mistserver/" PACKAGE_VERSION "/" + Util::Config::libver);
H.SetBody(
"<!DOCTYPE html><html><head><title>Unsupported Media Type</title></head><body><h1>Unsupported Media Type</h1>The server isn't quite sure what you wanted to receive from it.</body></html>");
long long int ret = Util::getMS();
conn->SendNow(H.BuildResponse("415", "Unsupported Media Type"));
return ret;
}
void Handle_Timeout(HTTP::Parser & H, Socket::Connection * conn){
long long int Handle_Timeout(HTTP::Parser & H, Socket::Connection * conn){
H.Clean();
H.SetHeader("Server", "mistserver/" PACKAGE_VERSION "/" + Util::Config::libver);
H.SetBody(
"<!DOCTYPE html><html><head><title>Gateway timeout</title></head><body><h1>Gateway timeout</h1>Though the server understood your request and attempted to handle it, somehow handling it took longer than it should. Your request has been cancelled - please try again later.</body></html>");
long long int ret = Util::getMS();
conn->SendNow(H.BuildResponse("504", "Gateway Timeout"));
return ret;
}
/// Handles internal requests.
void Handle_Internal(HTTP::Parser & H, Socket::Connection * conn){
long long int Handle_Internal(HTTP::Parser & H, Socket::Connection * conn){
std::string url = H.getUrl();
@ -117,8 +121,9 @@ namespace Connector_HTTP {
H.SetHeader("Server", "mistserver/" PACKAGE_VERSION "/" + Util::Config::libver);
H.SetBody(
"<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy SYSTEM \"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy><allow-access-from domain=\"*\" /><site-control permitted-cross-domain-policies=\"all\"/></cross-domain-policy>");
long long int ret = Util::getMS();
conn->SendNow(H.BuildResponse("200", "OK"));
return;
return ret;
} //crossdomain.xml
if (url == "/clientaccesspolicy.xml"){
@ -127,8 +132,9 @@ namespace Connector_HTTP {
H.SetHeader("Server", "mistserver/" PACKAGE_VERSION "/" + Util::Config::libver);
H.SetBody(
"<?xml version=\"1.0\" encoding=\"utf-8\"?><access-policy><cross-domain-access><policy><allow-from http-methods=\"*\" http-request-headers=\"*\"><domain uri=\"*\"/></allow-from><grant-to><resource path=\"/\" include-subpaths=\"true\"/></grant-to></policy></cross-domain-access></access-policy>");
long long int ret = Util::getMS();
conn->SendNow(H.BuildResponse("200", "OK"));
return;
return ret;
} //clientaccesspolicy.xml
if ((url.length() > 9 && url.substr(0, 6) == "/info_" && url.substr(url.length() - 3, 3) == ".js")
@ -192,15 +198,16 @@ namespace Connector_HTTP {
response.append("(\"" + streamname + "\"));\n");
}
H.SetBody(response);
long long int ret = Util::getMS();
conn->SendNow(H.BuildResponse("200", "OK"));
return;
return ret;
} //embed code generator
Handle_None(H, conn); //anything else doesn't get handled
return Handle_None(H, conn); //anything else doesn't get handled
}
/// Handles requests without associated handler, displaying a nice friendly error message.
void Handle_Through_Connector(HTTP::Parser & H, Socket::Connection * conn, std::string & connector){
long long int Handle_Through_Connector(HTTP::Parser & H, Socket::Connection * conn, std::string & connector){
//create a unique ID based on a hash of the user agent and host, followed by the stream name and connector
std::string uid = Secure::md5(H.GetHeader("User-Agent") + conn->getHost()) + "_" + H.GetVar("stream") + "_" + connector;
H.SetHeader("X-Stream", H.GetVar("stream"));
@ -222,7 +229,7 @@ namespace Connector_HTTP {
std::cout << "Created new connection " << uid << std::endl;
#endif
}else{
#if DEBUG >= 4
#if DEBUG >= 5
std::cout << "Re-using connection " << uid << std::endl;
#endif
}
@ -241,8 +248,7 @@ namespace Connector_HTTP {
tthread::lock_guard<tthread::mutex> guard(connconn[uid]->in_use);
//if the server connection is dead, handle as timeout.
if ( !connconn.count(uid) || !connconn[uid]->conn->connected()){
Handle_Timeout(H, conn);
return;
return Handle_Timeout(H, conn);
}
//forward the original request
connconn[uid]->conn->SendNow(request);
@ -270,8 +276,7 @@ namespace Connector_HTTP {
//keep trying unless the timeout triggers
if (timeout++ > 4000){
std::cout << "[20s timeout triggered]" << std::endl;
Handle_Timeout(H, conn);
return;
return Handle_Timeout(H, conn);
}else{
Util::sleep(5);
}
@ -279,9 +284,9 @@ namespace Connector_HTTP {
}
if ( !connconn.count(uid) || !connconn[uid]->conn->connected() || !conn->connected()){
//failure, disconnect and sent error to user
Handle_Timeout(H, conn);
return;
return Handle_Timeout(H, conn);
}else{
long long int ret = Util::getMS();
//success, check type of response
if (H.GetHeader("Content-Length") != ""){
//known length - simply re-send the request with added headers and continue
@ -311,6 +316,7 @@ namespace Connector_HTTP {
delete myConn;
conn->close();
}
return ret;
}
}
@ -383,11 +389,12 @@ namespace Connector_HTTP {
}
if (Client.Read(conn->Received().get())){
std::string handler = getHTTPType(Client);
long long int startms = Util::getMS();
#if DEBUG >= 4
std::cout << "Received request: " << Client.getUrl() << " (" << conn->getSocket() << ") => " << handler << " (" << Client.GetVar("stream")
<< ")" << std::endl;
long long int startms = Util::getMS();
#endif
long long int midms = 0;
bool closeConnection = false;
if (Client.GetHeader("Connection") == "close"){
closeConnection = true;
@ -395,15 +402,16 @@ namespace Connector_HTTP {
if (handler == "none" || handler == "internal"){
if (handler == "internal"){
Handle_Internal(Client, conn);
midms = Handle_Internal(Client, conn);
}else{
Handle_None(Client, conn);
midms = Handle_None(Client, conn);
}
}else{
Handle_Through_Connector(Client, conn, handler);
midms = Handle_Through_Connector(Client, conn, handler);
}
#if DEBUG >= 4
std::cout << "Completed request (" << conn->getSocket() << ") " << handler << " in " << (Util::getMS() - startms) << " ms" << std::endl;
long long int nowms = Util::getMS();
std::cout << "Completed request " << conn->getSocket() << " " << handler << " in " << (midms - startms) << " ms (processing) / " << (nowms - midms) << " ms (transfer)" << std::endl;
#endif
if (closeConnection){
break;

View file

@ -137,7 +137,7 @@ namespace Connector_HTTP {
}
}
if (HTTP_R.Read(conn.Received().get())){
#if DEBUG >= 4
#if DEBUG >= 5
std::cout << "Received request: " << HTTP_R.getUrl() << std::endl;
#endif
conn.setHost(HTTP_R.GetHeader("X-Origin"));
@ -192,9 +192,6 @@ namespace Connector_HTTP {
std::string manifest = BuildIndex(streamname, Strm.metadata);
HTTP_S.SetBody(manifest);
conn.SendNow(HTTP_S.BuildResponse("200", "OK"));
#if DEBUG >= 3
printf("Sent index\n");
#endif
pending_manifest = false;
}else{
pending_manifest = true;
@ -226,7 +223,7 @@ namespace Connector_HTTP {
continue;
}
ss.setBlocking(false);
#if DEBUG >= 3
#if DEBUG >= 5
fprintf(stderr, "Everything connected, starting to send video data...\n");
#endif
inited = true;
@ -250,9 +247,6 @@ namespace Connector_HTTP {
HTTP_S.SetHeader("Connection", "keep-alive");
HTTP_S.SetBody(manifest);
conn.SendNow(HTTP_S.BuildResponse("200", "OK"));
#if DEBUG >= 3
printf("Sent manifest\n");
#endif
pending_manifest = false;
}
if ( !receive_marks && Strm.metadata.isMember("length")){
@ -260,13 +254,7 @@ namespace Connector_HTTP {
}
if ((Strm.getPacket(0).isMember("keyframe") && !receive_marks) || Strm.lastType() == DTSC::PAUSEMARK){
TSBuf.flush();
#if DEBUG >= 4
fprintf(stderr, "Received a %s fragment of %i bytes.\n", Strm.getPacket(0)["datatype"].asString().c_str(), TSBuf.str().size());
#endif
if (Flash_RequestPending > 0 && TSBuf.str().size()){
#if DEBUG >= 3
fprintf(stderr, "Sending a fragment...");
#endif
HTTP_S.Clean();
HTTP_S.protocol = "HTTP/1.1";
HTTP_S.SetHeader("Content-Type", "video/mp2t");
@ -278,9 +266,6 @@ namespace Connector_HTTP {
TSBuf.str("");
Flash_RequestPending--;
PacketNumber = 0;
#if DEBUG >= 3
fprintf(stderr, "Done\n");
#endif
}
TSBuf.str("");
}
@ -367,9 +352,6 @@ namespace Connector_HTTP {
std::string manifest = BuildIndex(streamname, Strm.metadata);
HTTP_S.SetBody(manifest);
conn.SendNow(HTTP_S.BuildResponse("200", "OK"));
#if DEBUG >= 3
printf("Sent index\n");
#endif
pending_manifest = false;
}
}
@ -381,17 +363,8 @@ namespace Connector_HTTP {
conn.close();
ss.SendNow(conn.getStats("HTTP_Live").c_str());
ss.close();
#if DEBUG >= 1
fprintf(stderr, "User %i disconnected.\n", conn.getSocket());
if (inited){
fprintf(stderr, "Status was: inited\n");
}else{
if (ready4data){
fprintf(stderr, "Status was: ready4data\n");
}else{
fprintf(stderr, "Status was: connected\n");
}
}
#if DEBUG >= 5
fprintf(stderr, "HLS: User %i disconnected.\n", conn.getSocket());
#endif
return 0;
} //Connector_HTTP_Dynamic main function
@ -415,7 +388,7 @@ int main(int argc, char ** argv){
if (myid == 0){ //if new child, start MAINHANDLER
return Connector_HTTP::Connector_HTTP_Live(S);
}else{ //otherwise, do nothing or output debugging text
#if DEBUG >= 3
#if DEBUG >= 5
fprintf(stderr, "Spawned new process %i for socket %i\n", (int)myid, S.getSocket());
#endif
}

View file

@ -55,7 +55,7 @@ namespace Connector_HTTP {
}
}
if (HTTP_R.Read(conn.Received().get())){
#if DEBUG >= 4
#if DEBUG >= 5
std::cout << "Received request: " << HTTP_R.getUrl() << std::endl;
#endif
conn.setHost(HTTP_R.GetHeader("X-Origin"));
@ -133,9 +133,6 @@ namespace Connector_HTTP {
cmd << "s " << seek_sec << "\n";
ss.SendNow(cmd.str().c_str());
}
#if DEBUG >= 3
fprintf(stderr, "Everything connected, starting to send video data...\n");
#endif
ss.SendNow("p\n");
inited = true;
}
@ -173,9 +170,6 @@ namespace Connector_HTTP {
}
}
progressive_has_sent_header = true;
#if DEBUG >= 1
fprintf(stderr, "Sent progressive FLV header\n");
#endif
}
if ( !isMP3){
tag.DTSCLoader(Strm);
@ -219,7 +213,7 @@ int main(int argc, char ** argv){
if (myid == 0){ //if new child, start MAINHANDLER
return Connector_HTTP::Connector_HTTP_Progressive(S);
}else{ //otherwise, do nothing or output debugging text
#if DEBUG >= 3
#if DEBUG >= 5
fprintf(stderr, "Spawned new process %i for socket %i\n", (int)myid, S.getSocket());
#endif
}

View file

@ -132,7 +132,7 @@ namespace Connector_HTTP {
}
}
if (HTTP_R.Read(conn.Received().get())){
#if DEBUG >= 4
#if DEBUG >= 5
std::cout << "Received request: " << HTTP_R.getUrl() << std::endl;
#endif
conn.setHost(HTTP_R.GetHeader("X-Origin"));
@ -167,9 +167,6 @@ namespace Connector_HTTP {
}
tempStr = tempStr.substr(tempStr.find("(") + 1);
ReqFragment = atoll(tempStr.substr(0, tempStr.find(")")).c_str());
#if DEBUG >= 4
printf("Quality: %s, Time %d\n", Quality.c_str(), (ReqFragment / 10000));
#endif
std::stringstream sstream;
sstream << "s " << (ReqFragment / 10000) << "\no \n";
ss.SendNow(sstream.str().c_str());
@ -183,9 +180,6 @@ namespace Connector_HTTP {
std::string manifest = BuildManifest(streamname, Strm.metadata);
HTTP_S.SetBody(manifest);
conn.SendNow(HTTP_S.BuildResponse("200", "OK"));
#if DEBUG >= 3
printf("Sent manifest\n");
#endif
pending_manifest = false;
}else{
pending_manifest = true;
@ -217,9 +211,6 @@ namespace Connector_HTTP {
continue;
}
ss.setBlocking(false);
#if DEBUG >= 3
fprintf(stderr, "Everything connected, starting to send video data...\n");
#endif
inited = true;
}
unsigned int now = Util::epoch();
@ -236,9 +227,6 @@ namespace Connector_HTTP {
std::string manifest = BuildManifest(streamname, Strm.metadata);
HTTP_S.SetBody(manifest);
conn.SendNow(HTTP_S.BuildResponse("200", "OK"));
#if DEBUG >= 3
printf("Sent manifest\n");
#endif
pending_manifest = false;
}
if (Strm.lastType() == DTSC::PAUSEMARK){
@ -246,9 +234,6 @@ namespace Connector_HTTP {
fprintf(stderr, "Received a %s fragment of %i bytes.\n", Strm.getPacket(0)["datatype"].asString().c_str(), FlashBufSize);
#endif
if (Flash_RequestPending > 0 && FlashBufSize){
#if DEBUG >= 3
fprintf(stderr, "Sending a fragment...");
#endif
//static std::string btstrp;
//btstrp = GenerateBootstrap(streamname, Strm.metadata, ReqFragment, FlashBufTime, Strm.getPacket(0)["time"]);
HTTP_S.Clean();
@ -350,9 +335,6 @@ namespace Connector_HTTP {
FlashBuf.pop_front();
}
Flash_RequestPending--;
#if DEBUG >= 3
fprintf(stderr, "Done\n");
#endif
}
FlashBuf.clear();
FlashBufSize = 0;
@ -369,9 +351,6 @@ namespace Connector_HTTP {
std::string manifest = BuildManifest(streamname, Strm.metadata);
HTTP_S.SetBody(manifest);
conn.SendNow(HTTP_S.BuildResponse("200", "OK"));
#if DEBUG >= 3
printf("Sent manifest\n");
#endif
pending_manifest = false;
}
}
@ -405,7 +384,7 @@ int main(int argc, char ** argv){
if (myid == 0){ //if new child, start MAINHANDLER
return Connector_HTTP::Connector_HTTP_Dynamic(S);
}else{ //otherwise, do nothing or output debugging text
#if DEBUG >= 3
#if DEBUG >= 5
fprintf(stderr, "Spawned new process %i for socket %i\n", (int)myid, S.getSocket());
#endif
}

View file

@ -67,11 +67,11 @@ int Connector_RTMP::Connector_RTMP(Socket::Connection conn){
}
Socket.Received().remove(1536);
RTMPStream::rec_cnt += 1536;
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "Handshake succcess!\n");
#endif
}else{
#if DEBUG >= 1
#if DEBUG >= 5
fprintf(stderr, "Handshake fail!\n");
#endif
return 0;
@ -99,9 +99,6 @@ int Connector_RTMP::Connector_RTMP(Socket::Connection conn){
break;
}
SS.setBlocking(false);
#if DEBUG >= 3
fprintf(stderr, "Everything connected, starting to send video data...\n");
#endif
SS.SendNow("p\n");
inited = true;
}
@ -213,18 +210,18 @@ void Connector_RTMP::parseChunk(Socket::Buffer & inbuffer){
break; //happens when connection breaks unexpectedly
case 1: //set chunk size
RTMPStream::chunk_rec_max = ntohl(*(int*)next.data.c_str());
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "CTRL: Set chunk size: %i\n", RTMPStream::chunk_rec_max);
#endif
break;
case 2: //abort message - we ignore this one
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "CTRL: Abort message\n");
#endif
//4 bytes of stream id to drop
break;
case 3: //ack
#if DEBUG >= 4
#if DEBUG >= 8
fprintf(stderr, "CTRL: Acknowledgement\n");
#endif
RTMPStream::snd_window_at = ntohl(*(int*)next.data.c_str());
@ -241,7 +238,7 @@ void Connector_RTMP::parseChunk(Socket::Buffer & inbuffer){
//6 = pingrequest, 4 bytes data
//7 = pingresponse, 4 bytes data
//we don't need to process this
#if DEBUG >= 4
#if DEBUG >= 5
short int ucmtype = ntohs(*(short int*)next.data.c_str());
switch (ucmtype){
case 0:
@ -273,7 +270,7 @@ void Connector_RTMP::parseChunk(Socket::Buffer & inbuffer){
}
break;
case 5: //window size of other end
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "CTRL: Window size\n");
#endif
RTMPStream::rec_window_size = ntohl(*(int*)next.data.c_str());
@ -281,7 +278,7 @@ void Connector_RTMP::parseChunk(Socket::Buffer & inbuffer){
Socket.Send(RTMPStream::SendCTL(3, RTMPStream::rec_cnt)); //send ack (msg 3)
break;
case 6:
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "CTRL: Set peer bandwidth\n");
#endif
//4 bytes window size, 1 byte limit type (ignored)
@ -311,34 +308,34 @@ void Connector_RTMP::parseChunk(Socket::Buffer & inbuffer){
}
}
}else{
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "Received useless media data\n");
#endif
Socket.close();
}
break;
case 15:
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "Received AFM3 data message\n");
#endif
break;
case 16:
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "Received AFM3 shared object\n");
#endif
break;
case 17: {
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "Received AFM3 command message\n");
#endif
if (next.data[0] != 0){
next.data = next.data.substr(1);
amf3data = AMF::parse3(next.data);
#if DEBUG >= 4
#if DEBUG >= 5
amf3data.Print();
#endif
}else{
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "Received AFM3-0 command message\n");
#endif
next.data = next.data.substr(1);
@ -348,7 +345,7 @@ void Connector_RTMP::parseChunk(Socket::Buffer & inbuffer){
}
break;
case 19:
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "Received AFM0 shared object\n");
#endif
break;
@ -358,7 +355,7 @@ void Connector_RTMP::parseChunk(Socket::Buffer & inbuffer){
}
break;
case 22:
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "Received aggregate message\n");
#endif
break;
@ -373,7 +370,7 @@ void Connector_RTMP::parseChunk(Socket::Buffer & inbuffer){
} //parseChunk
void Connector_RTMP::sendCommand(AMF::Object & amfreply, int messagetype, int stream_id){
#if DEBUG >= 4
#if DEBUG >= 8
std::cerr << amfreply.Print() << std::endl;
#endif
if (messagetype == 17){
@ -384,10 +381,10 @@ void Connector_RTMP::sendCommand(AMF::Object & amfreply, int messagetype, int st
} //sendCommand
void Connector_RTMP::parseAMFCommand(AMF::Object & amfdata, int messagetype, int stream_id){
#if DEBUG >= 4
#if DEBUG >= 5
fprintf(stderr, "Received command: %s\n", amfdata.Print().c_str());
#endif
#if DEBUG >= 3
#if DEBUG >= 8
fprintf(stderr, "AMF0 command: %s\n", amfdata.getContentP(0)->StrValue().c_str());
#endif
if (amfdata.getContentP(0)->StrValue() == "connect"){
@ -395,7 +392,7 @@ void Connector_RTMP::parseAMFCommand(AMF::Object & amfdata, int messagetype, int
if (amfdata.getContentP(2)->getContentP("objectEncoding")){
objencoding = amfdata.getContentP(2)->getContentP("objectEncoding")->NumValue();
}
#if DEBUG >= 4
#if DEBUG >= 6
int tmpint;
if (amfdata.getContentP(2)->getContentP("videoCodecs")){
tmpint = (int)amfdata.getContentP(2)->getContentP("videoCodecs")->NumValue();
@ -489,9 +486,6 @@ void Connector_RTMP::parseAMFCommand(AMF::Object & amfdata, int messagetype, int
SS.Send(Socket.getHost().c_str());
SS.Send("\n");
nostats = true;
#if DEBUG >= 4
fprintf(stderr, "Connected to buffer, starting to send data...\n");
#endif
}
//send a _result reply
AMF::Object amfreply("container", AMF::AMF0_DDV_CONTAINER);
@ -611,7 +605,7 @@ int main(int argc, char ** argv){
if (myid == 0){ //if new child, start MAINHANDLER
return Connector_RTMP::Connector_RTMP(S);
}else{ //otherwise, do nothing or output debugging text
#if DEBUG >= 3
#if DEBUG >= 5
fprintf(stderr, "Spawned new process %i for socket %i\n", (int)myid, S.getSocket());
#endif
}

View file

@ -54,9 +54,6 @@ int TS_Handler(Socket::Connection conn, std::string streamname){
break;
}
ss.SendNow("p\n");
#if DEBUG >= 3
fprintf(stderr, "Everything connected, starting to send video data...\n");
#endif
inited = true;
}
if (ss.spool()){
@ -175,7 +172,6 @@ int TS_Handler(Socket::Connection conn, std::string streamname){
}
}
}
fprintf(stderr, "Exiting\n");
return 0;
}
@ -194,12 +190,11 @@ int main(int argc, char ** argv){
while (server_socket.connected() && conf.is_active){
Socket::Connection S = server_socket.accept();
if (S.connected()){ //check if the new connection is valid
fprintf(stderr, "Incoming connection\n");
pid_t myid = fork();
if (myid == 0){ //if new child, start MAINHANDLER
return TS_Handler(S, conf.getString("streamname"));
}else{ //otherwise, do nothing or output debugging text
#if DEBUG >= 3
#if DEBUG >= 5
fprintf(stderr, "Spawned new process %i for socket %i\n", (int)myid, S.getSocket());
#endif
}

View file

@ -166,9 +166,6 @@ int main(int argc, char** argv){
}
++playing;
in_out.setBlocking(false);
#if DEBUG >= 4
std::cerr << "Playing one keyframe" << std::endl;
#endif
bench = Util::getMS();
}
break;
@ -199,7 +196,7 @@ int main(int argc, char** argv){
}
if (playing == 0){
#if DEBUG >= 4
std::cerr << "Sending pause_marker (" << (Util::getMS() - bench) << "ms)" << std::endl;
std::cerr << "Completed VoD request in MistPlayer (" << (Util::getMS() - bench) << "ms)" << std::endl;
#endif
pausemark["time"] = source.getJSON()["time"];
pausemark.toPacked();
@ -220,11 +217,11 @@ int main(int argc, char** argv){
}
StatsSocket.close();
in_out.close();
#if DEBUG >= 4
#if DEBUG >= 5
if (Util::epoch() - lasttime < 60){
std::cerr << "Player exited (disconnect)." << std::endl;
std::cerr << "MistPlayer exited (disconnect)." << std::endl;
}else{
std::cerr << "Player exited (timeout)." << std::endl;
std::cerr << "MistPlayer exited (command timeout)." << std::endl;
}
#endif
return 0;