diff --git a/lib/dtsc.cpp b/lib/dtsc.cpp index d7981462..78d0a2c3 100644 --- a/lib/dtsc.cpp +++ b/lib/dtsc.cpp @@ -316,7 +316,13 @@ bool DTSC::File::writeHeader(std::string & header, bool force){ /// Reading the packet means the file position is increased to the next packet. void DTSC::File::seekNext(){ if (fread(buffer, 4, 1, F) != 1){ - fprintf(stderr, "Could not read header\n"); + if (feof(F)){ + #if DEBUG >= 4 + fprintf(stderr, "End of file reached.\n"); + #endif + }else{ + fprintf(stderr, "Could not read header\n"); + } strbuffer = ""; jsonbuffer.null(); return; diff --git a/lib/http_parser.cpp b/lib/http_parser.cpp index b554e5c0..ac0e1f7b 100644 --- a/lib/http_parser.cpp +++ b/lib/http_parser.cpp @@ -110,7 +110,7 @@ void HTTP::Parser::SetHeader(std::string i, std::string v){ /// Sets header i to integer value v. void HTTP::Parser::SetHeader(std::string i, int v){ Trim(i); - char val[128]; + char val[23];//ints are never bigger than 22 chars as decimal sprintf(val, "%i", v); headers[i] = val; } diff --git a/lib/socket.cpp b/lib/socket.cpp index f6250aa7..10f39465 100644 --- a/lib/socket.cpp +++ b/lib/socket.cpp @@ -21,6 +21,13 @@ std::string uint2string(unsigned int i){ return st.str(); } +void ms_sleep(int ms){ + struct timespec T; + T.tv_sec = ms/1000; + T.tv_nsec = 1000*(ms%1000); + nanosleep(&T, 0); +} + /// Returns the amount of elements in the internal std::deque of std::string objects. /// The back is popped as long as it is empty, first - this way this function is /// guaranteed to return 0 if the buffer is empty. @@ -73,6 +80,7 @@ std::string Socket::Buffer::remove(unsigned int count){ if (!available(count)){return "";} unsigned int i = 0; std::string ret; + ret.reserve(count); for (std::deque::reverse_iterator it = data.rbegin(); it != data.rend(); ++it){ if (i + (*it).size() < count){ ret.append(*it); @@ -339,7 +347,7 @@ bool Socket::Connection::spool(){ bool Socket::Connection::flush(){ while (upbuffer.size() > 0 && connected()){ if (!iwrite(upbuffer.get())){ - usleep(10000);//sleep 10ms + ms_sleep(10);//sleep 10ms } } /// \todo Provide better mechanism to prevent overbuffering. @@ -356,41 +364,22 @@ Socket::Buffer & Socket::Connection::Received(){ return downbuffer; } -/// Appends data to the upbuffer. -/// This will attempt to send the upbuffer (if non-empty) first. -/// If the upbuffer is empty before or after this attempt, it will attempt to send -/// the data right away. Any data that could not be send will be put into the upbuffer. -/// This means this function is blocking if the socket is, but nonblocking otherwise. -void Socket::Connection::Send(std::string & data){ - while (upbuffer.size() > 0){ - if (!iwrite(upbuffer.get())){break;} - } - if (upbuffer.size() > 0){ - upbuffer.append(data); - }else{ - int i = iwrite(data.c_str(), data.size()); - if (i < data.size()){ - upbuffer.append(data.c_str()+i, data.size() - i); +/// Will not buffer anything but always send right away. Blocks. +/// This will send the upbuffer (if non-empty) first, then the data. +/// Any data that could not be send will block until it can be send or the connection is severed. +void Socket::Connection::SendNow(const char * data, size_t len){ + while (upbuffer.size() > 0 && connected()){ + if (!iwrite(upbuffer.get())){ + ms_sleep(1);//sleep 1ms if buffer full } } -} - -/// Appends data to the upbuffer. -/// This will attempt to send the upbuffer (if non-empty) first. -/// If the upbuffer is empty before or after this attempt, it will attempt to send -/// the data right away. Any data that could not be send will be put into the upbuffer. -/// This means this function is blocking if the socket is, but nonblocking otherwise. -void Socket::Connection::Send(const char * data){ - int len = strlen(data); - while (upbuffer.size() > 0){ - if (!iwrite(upbuffer.get())){break;} - } - if (upbuffer.size() > 0){ - upbuffer.append(data, len); - }else{ - int i = iwrite(data, len); - if (i < len){ - upbuffer.append(data + i, len - i); + int i = iwrite(data, len); + while (i < len && connected()){ + int j = iwrite(data+i, len-i); + if (j > 0){ + i += j; + }else{ + ms_sleep(1);//sleep 1ms and retry } } } @@ -414,6 +403,40 @@ void Socket::Connection::Send(const char * data, size_t len){ } } +/// Will not buffer anything but always send right away. Blocks. +/// This will send the upbuffer (if non-empty) first, then the data. +/// Any data that could not be send will block until it can be send or the connection is severed. +void Socket::Connection::SendNow(const char * data){ + int len = strlen(data); + SendNow(data, len); +} + +/// Appends data to the upbuffer. +/// This will attempt to send the upbuffer (if non-empty) first. +/// If the upbuffer is empty before or after this attempt, it will attempt to send +/// the data right away. Any data that could not be send will be put into the upbuffer. +/// This means this function is blocking if the socket is, but nonblocking otherwise. +void Socket::Connection::Send(const char * data){ + int len = strlen(data); + Send(data, len); +} + +/// Will not buffer anything but always send right away. Blocks. +/// This will send the upbuffer (if non-empty) first, then the data. +/// Any data that could not be send will block until it can be send or the connection is severed. +void Socket::Connection::SendNow(std::string & data){ + SendNow(data.c_str(), data.size()); +} + +/// Appends data to the upbuffer. +/// This will attempt to send the upbuffer (if non-empty) first. +/// If the upbuffer is empty before or after this attempt, it will attempt to send +/// the data right away. Any data that could not be send will be put into the upbuffer. +/// This means this function is blocking if the socket is, but nonblocking otherwise. +void Socket::Connection::Send(std::string & data){ + Send(data.c_str(), data.size()); +} + /// Incremental write call. This function tries to write len bytes to the socket from the buffer, /// returning the amount of bytes it actually wrote. /// \param buffer Location of the buffer to write from. diff --git a/lib/socket.h b/lib/socket.h index 3283c99b..4b4394b8 100644 --- a/lib/socket.h +++ b/lib/socket.h @@ -75,6 +75,9 @@ namespace Socket{ void Send(std::string & data); ///< Appends data to the upbuffer. void Send(const char * data); ///< Appends data to the upbuffer. void Send(const char * data, size_t len); ///< Appends data to the upbuffer. + void SendNow(std::string & data); ///< Will not buffer anything but always send right away. Blocks. + void SendNow(const char * data); ///< Will not buffer anything but always send right away. Blocks. + void SendNow(const char * data, size_t len); ///< Will not buffer anything but always send right away. Blocks. //stats related methods unsigned int dataUp(); ///< Returns total amount of bytes sent. unsigned int dataDown(); ///< Returns total amount of bytes received.