|
|
@ -108,9 +108,11 @@ std::pair<CActiveSocket*,clients_map*> get_client(int server_id,int client_id)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void handle_error(CSimpleSocket::CSocketError err,bool skip_timeout=true)
|
|
|
|
void handle_error(CSimpleSocket::CSocketError err,bool skip_timeout=true)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if(err==CSimpleSocket::SocketSuccess)
|
|
|
|
if (err == CSimpleSocket::SocketSuccess)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
if(err==CSimpleSocket::SocketTimedout && skip_timeout)
|
|
|
|
if (err == CSimpleSocket::SocketTimedout && skip_timeout)
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (err == CSimpleSocket::SocketEwouldblock && skip_timeout)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
throw std::runtime_error(translate_socket_error(err));
|
|
|
|
throw std::runtime_error(translate_socket_error(err));
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -218,6 +220,7 @@ static std::string lua_client_receive(int server_id,int client_id,int bytes,std:
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ret+=(char)*sock->GetData();
|
|
|
|
ret+=(char)*sock->GetData();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -285,42 +288,80 @@ static int lua_socket_connect(std::string ip,int port)
|
|
|
|
delete sock;
|
|
|
|
delete sock;
|
|
|
|
throw std::runtime_error(translate_socket_error(err));
|
|
|
|
throw std::runtime_error(translate_socket_error(err));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sock->SetNonblocking();
|
|
|
|
last_client_id++;
|
|
|
|
last_client_id++;
|
|
|
|
clients[last_client_id]=sock;
|
|
|
|
clients[last_client_id]=sock;
|
|
|
|
return last_client_id;
|
|
|
|
return last_client_id;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
static void lua_socket_set_timeout(int server_id,int client_id,int32_t sec,int32_t msec)
|
|
|
|
CSimpleSocket* get_socket(int server_id, int client_id)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
std::map<int,CActiveSocket*>* target=&clients;
|
|
|
|
std::map<int, CActiveSocket*>* target = &clients;
|
|
|
|
if(server_id>0)
|
|
|
|
if (server_id>0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if(servers.count(server_id)==0)
|
|
|
|
if (servers.count(server_id) == 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
throw std::runtime_error("Server with this id does not exist");
|
|
|
|
throw std::runtime_error("Server with this id does not exist");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
server &cur_server=servers[server_id];
|
|
|
|
server &cur_server = servers[server_id];
|
|
|
|
if(client_id==-1)
|
|
|
|
if (client_id == -1)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
cur_server.socket->SetConnectTimeout(sec,msec);
|
|
|
|
return cur_server.socket;
|
|
|
|
cur_server.socket->SetReceiveTimeout(sec,msec);
|
|
|
|
|
|
|
|
cur_server.socket->SetSendTimeout(sec,msec);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
target=&cur_server.clients;
|
|
|
|
target = &cur_server.clients;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(target->count(client_id)==0)
|
|
|
|
if (target->count(client_id) == 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
throw std::runtime_error("Client does with this id not exist");
|
|
|
|
throw std::runtime_error("Client does with this id not exist");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
CActiveSocket *sock=(*target)[client_id];
|
|
|
|
CActiveSocket *sock = (*target)[client_id];
|
|
|
|
|
|
|
|
return sock;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static void lua_socket_set_timeout(int server_id,int client_id,int32_t sec,int32_t msec)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
CSimpleSocket *sock = get_socket(server_id, client_id);
|
|
|
|
sock->SetConnectTimeout(sec,msec);
|
|
|
|
sock->SetConnectTimeout(sec,msec);
|
|
|
|
sock->SetReceiveTimeout(sec,msec);
|
|
|
|
if (!sock->SetReceiveTimeout(sec, msec) ||
|
|
|
|
sock->SetSendTimeout(sec,msec);
|
|
|
|
!sock->SetSendTimeout(sec, msec))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
CSimpleSocket::CSocketError err = sock->GetSocketError();
|
|
|
|
|
|
|
|
throw std::runtime_error(translate_socket_error(err));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool lua_socket_select(int server_id, int client_id, int32_t sec, int32_t msec)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
CSimpleSocket *sock = get_socket(server_id, client_id);
|
|
|
|
|
|
|
|
return sock->Select(sec, msec);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static void lua_socket_set_blocking(int server_id, int client_id, bool value)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
CSimpleSocket *sock = get_socket(server_id, client_id);
|
|
|
|
|
|
|
|
bool ok;
|
|
|
|
|
|
|
|
if (value)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
ok = sock->SetBlocking();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
ok = sock->SetNonblocking();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!ok)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
CSimpleSocket::CSocketError err = sock->GetSocketError();
|
|
|
|
|
|
|
|
throw std::runtime_error(translate_socket_error(err));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool lua_socket_is_blocking(int server_id, int client_id)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
CSimpleSocket *sock = get_socket(server_id, client_id);
|
|
|
|
|
|
|
|
return !sock->IsNonblocking();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
DFHACK_PLUGIN_LUA_FUNCTIONS {
|
|
|
|
DFHACK_PLUGIN_LUA_FUNCTIONS {
|
|
|
|
DFHACK_LUA_FUNCTION(lua_socket_bind), //spawn a server
|
|
|
|
DFHACK_LUA_FUNCTION(lua_socket_bind), //spawn a server
|
|
|
|
DFHACK_LUA_FUNCTION(lua_socket_connect),//spawn a client (i.e. connection)
|
|
|
|
DFHACK_LUA_FUNCTION(lua_socket_connect),//spawn a client (i.e. connection)
|
|
|
|
|
|
|
|
DFHACK_LUA_FUNCTION(lua_socket_select),
|
|
|
|
|
|
|
|
DFHACK_LUA_FUNCTION(lua_socket_set_blocking),
|
|
|
|
|
|
|
|
DFHACK_LUA_FUNCTION(lua_socket_is_blocking),
|
|
|
|
DFHACK_LUA_FUNCTION(lua_socket_set_timeout),
|
|
|
|
DFHACK_LUA_FUNCTION(lua_socket_set_timeout),
|
|
|
|
DFHACK_LUA_FUNCTION(lua_server_accept),
|
|
|
|
DFHACK_LUA_FUNCTION(lua_server_accept),
|
|
|
|
DFHACK_LUA_FUNCTION(lua_server_close),
|
|
|
|
DFHACK_LUA_FUNCTION(lua_server_close),
|
|
|
|