diff --git a/ixwebsocket/IXWebSocketTransport.cpp b/ixwebsocket/IXWebSocketTransport.cpp index 7df64b7f..f88911ce 100644 --- a/ixwebsocket/IXWebSocketTransport.cpp +++ b/ixwebsocket/IXWebSocketTransport.cpp @@ -350,28 +350,9 @@ namespace ix } else if (pollResult == PollResultType::ReadyForRead) { - while (true) + if (!receiveFromSocket()) { - ssize_t ret = _socket->recv((char*) &_readbuf[0], _readbuf.size()); - - if (ret < 0 && Socket::isWaitNeeded()) - { - break; - } - else if (ret <= 0) - { - // if there are received data pending to be processed, then delay the abnormal - // closure to after dispatch (other close code/reason could be read from the - // buffer) - - closeSocket(); - - return PollResult::AbnormalClose; - } - else - { - _rxbuf.insert(_rxbuf.end(), _readbuf.begin(), _readbuf.begin() + ret); - } + return PollResult::AbnormalClose; } } else if (pollResult == PollResultType::Error) @@ -1053,19 +1034,17 @@ namespace ix wsheader_type::TEXT_FRAME, message, _enablePerMessageDeflate, onProgressCallback); } - ssize_t WebSocketTransport::send() - { - std::lock_guard lock(_socketMutex); - return _socket->send((char*) &_txbuf[0], _txbuf.size()); - } - bool WebSocketTransport::sendOnSocket() { std::lock_guard lock(_txbufMutex); while (_txbuf.size()) { - ssize_t ret = send(); + ssize_t ret = 0; + { + std::lock_guard lock(_socketMutex); + ret = _socket->send((char*) &_txbuf[0], _txbuf.size()); + } if (ret < 0 && Socket::isWaitNeeded()) { @@ -1086,6 +1065,34 @@ namespace ix return true; } + bool WebSocketTransport::receiveFromSocket() + { + while (true) + { + ssize_t ret = _socket->recv((char*) &_readbuf[0], _readbuf.size()); + + if (ret < 0 && Socket::isWaitNeeded()) + { + break; + } + else if (ret <= 0) + { + // if there are received data pending to be processed, then delay the abnormal + // closure to after dispatch (other close code/reason could be read from the + // buffer) + + closeSocket(); + return false; + } + else + { + _rxbuf.insert(_rxbuf.end(), _readbuf.begin(), _readbuf.begin() + ret); + } + } + + return true; + } + void WebSocketTransport::sendCloseFrame(uint16_t code, const std::string& reason) { bool compress = false; diff --git a/ixwebsocket/IXWebSocketTransport.h b/ixwebsocket/IXWebSocketTransport.h index 9feaf1d4..47c1bfee 100644 --- a/ixwebsocket/IXWebSocketTransport.h +++ b/ixwebsocket/IXWebSocketTransport.h @@ -99,7 +99,6 @@ namespace ix bool remote = false); void closeSocket(); - ssize_t send(); ReadyState getReadyState() const; void setReadyState(ReadyState readyState); @@ -245,6 +244,8 @@ namespace ix bool flushSendBuffer(); bool sendOnSocket(); + bool receiveFromSocket(); + WebSocketSendInfo sendData(wsheader_type::opcode_type type, const std::string& message, bool compress,