mirror of
https://github.com/defold/extension-websocket.git
synced 2025-06-27 17:57:43 +02:00
65 lines
1.9 KiB
C++
65 lines
1.9 KiB
C++
#include <dmsdk/dlib/socket.h>
|
|
#include <dmsdk/dlib/sslsocket.h>
|
|
#include "websocket.h"
|
|
|
|
namespace dmWebsocket
|
|
{
|
|
|
|
dmSocket::Result WaitForSocket(WebsocketConnection* conn, dmSocket::SelectorKind kind, int timeout)
|
|
{
|
|
dmSocket::Selector selector;
|
|
dmSocket::SelectorZero(&selector);
|
|
dmSocket::SelectorSet(&selector, kind, conn->m_Socket);
|
|
return dmSocket::Select(&selector, timeout);
|
|
}
|
|
|
|
dmSocket::Result Send(WebsocketConnection* conn, const char* buffer, int length, int* out_sent_bytes)
|
|
{
|
|
int total_sent_bytes = 0;
|
|
int sent_bytes = 0;
|
|
|
|
while (total_sent_bytes < length) {
|
|
dmSocket::Result r;
|
|
|
|
if (conn->m_SSLSocket)
|
|
r = dmSSLSocket::Send(conn->m_SSLSocket, buffer + total_sent_bytes, length - total_sent_bytes, &sent_bytes);
|
|
else
|
|
r = dmSocket::Send(conn->m_Socket, buffer + total_sent_bytes, length - total_sent_bytes, &sent_bytes);
|
|
|
|
if( r == dmSocket::RESULT_WOULDBLOCK )
|
|
{
|
|
r = dmSocket::RESULT_TRY_AGAIN;
|
|
}
|
|
|
|
if (r == dmSocket::RESULT_TRY_AGAIN)
|
|
continue;
|
|
|
|
if (r != dmSocket::RESULT_OK) {
|
|
return r;
|
|
}
|
|
|
|
total_sent_bytes += sent_bytes;
|
|
}
|
|
if (out_sent_bytes)
|
|
*out_sent_bytes = total_sent_bytes;
|
|
|
|
DebugPrint(2, "Sent buffer:", buffer, length);
|
|
return dmSocket::RESULT_OK;
|
|
}
|
|
|
|
dmSocket::Result Receive(WebsocketConnection* conn, void* buffer, int length, int* received_bytes)
|
|
{
|
|
dmSocket::Result sr;
|
|
if (conn->m_SSLSocket)
|
|
sr = dmSSLSocket::Receive(conn->m_SSLSocket, buffer, length, received_bytes);
|
|
else
|
|
sr = dmSocket::Receive(conn->m_Socket, buffer, length, received_bytes);
|
|
|
|
int num_bytes = received_bytes ? (uint32_t)*received_bytes : 0;
|
|
if (sr == dmSocket::RESULT_OK && num_bytes > 0)
|
|
DebugPrint(2, "Received bytes:", buffer, num_bytes);
|
|
|
|
return sr;
|
|
}
|
|
|
|
} // namespace
|