add socket:get_address, serversocket:get_port
This commit is contained in:
parent
3e949bd499
commit
21c76c1b0d
@ -59,6 +59,9 @@ socket:is_alive() --> bool
|
|||||||
|
|
||||||
-- Checks if the connection is present (using socket:send(...) is available).
|
-- Checks if the connection is present (using socket:send(...) is available).
|
||||||
socket:is_connected() --> bool
|
socket:is_connected() --> bool
|
||||||
|
|
||||||
|
-- Returns the address and port of the connection.
|
||||||
|
socket:get_address() --> str, int
|
||||||
```
|
```
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
@ -80,6 +83,9 @@ server:close()
|
|||||||
|
|
||||||
-- Checks if the TCP server exists and is open.
|
-- Checks if the TCP server exists and is open.
|
||||||
server:is_open() --> bool
|
server:is_open() --> bool
|
||||||
|
|
||||||
|
-- Returns the server port.
|
||||||
|
server:get_port() --> int
|
||||||
```
|
```
|
||||||
|
|
||||||
## Analytics
|
## Analytics
|
||||||
|
|||||||
@ -59,6 +59,9 @@ socket:is_alive() --> bool
|
|||||||
|
|
||||||
-- Проверяет наличие соединения (доступно использование socket:send(...)).
|
-- Проверяет наличие соединения (доступно использование socket:send(...)).
|
||||||
socket:is_connected() --> bool
|
socket:is_connected() --> bool
|
||||||
|
|
||||||
|
-- Возвращает адрес и порт соединения.
|
||||||
|
socket:get_address() --> str, int
|
||||||
```
|
```
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
@ -80,6 +83,9 @@ server:close()
|
|||||||
|
|
||||||
-- Проверяет, существует и открыт ли TCP сервер.
|
-- Проверяет, существует и открыт ли TCP сервер.
|
||||||
server:is_open() --> bool
|
server:is_open() --> bool
|
||||||
|
|
||||||
|
-- Возвращает порт сервера.
|
||||||
|
server:get_port() --> int
|
||||||
```
|
```
|
||||||
|
|
||||||
## Аналитика
|
## Аналитика
|
||||||
|
|||||||
@ -42,6 +42,7 @@ local Socket = {__index={
|
|||||||
close=function(self) return network.__close(self.id) end,
|
close=function(self) return network.__close(self.id) end,
|
||||||
is_alive=function(self) return network.__is_alive(self.id) end,
|
is_alive=function(self) return network.__is_alive(self.id) end,
|
||||||
is_connected=function(self) return network.__is_connected(self.id) end,
|
is_connected=function(self) return network.__is_connected(self.id) end,
|
||||||
|
get_address=function(self) return network.__get_address(self.id) end,
|
||||||
}}
|
}}
|
||||||
|
|
||||||
network.tcp_connect = function(address, port, callback)
|
network.tcp_connect = function(address, port, callback)
|
||||||
@ -55,6 +56,7 @@ end
|
|||||||
local ServerSocket = {__index={
|
local ServerSocket = {__index={
|
||||||
close=function(self) return network.__closeserver(self.id) end,
|
close=function(self) return network.__closeserver(self.id) end,
|
||||||
is_open=function(self) return network.__is_serveropen(self.id) end,
|
is_open=function(self) return network.__is_serveropen(self.id) end,
|
||||||
|
get_port=function(self) return network.__get_serverport(self.id) end,
|
||||||
}}
|
}}
|
||||||
|
|
||||||
network.tcp_open = function(port, handler)
|
network.tcp_open = function(port, handler)
|
||||||
|
|||||||
@ -151,6 +151,16 @@ static int l_is_connected(lua::State* L) {
|
|||||||
return lua::pushboolean(L, false);
|
return lua::pushboolean(L, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int l_get_address(lua::State* L) {
|
||||||
|
u64id_t id = lua::tointeger(L, 1);
|
||||||
|
if (auto connection = engine->getNetwork().getConnection(id)) {
|
||||||
|
lua::pushstring(L, connection->getAddress());
|
||||||
|
lua::pushinteger(L, connection->getPort());
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int l_is_serveropen(lua::State* L) {
|
static int l_is_serveropen(lua::State* L) {
|
||||||
u64id_t id = lua::tointeger(L, 1);
|
u64id_t id = lua::tointeger(L, 1);
|
||||||
if (auto server = engine->getNetwork().getServer(id)) {
|
if (auto server = engine->getNetwork().getServer(id)) {
|
||||||
@ -159,6 +169,14 @@ static int l_is_serveropen(lua::State* L) {
|
|||||||
return lua::pushboolean(L, false);
|
return lua::pushboolean(L, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int l_get_serverport(lua::State* L) {
|
||||||
|
u64id_t id = lua::tointeger(L, 1);
|
||||||
|
if (auto server = engine->getNetwork().getServer(id)) {
|
||||||
|
return lua::pushinteger(L, server->getPort());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int l_get_total_upload(lua::State* L) {
|
static int l_get_total_upload(lua::State* L) {
|
||||||
return lua::pushinteger(L, engine->getNetwork().getTotalUpload());
|
return lua::pushinteger(L, engine->getNetwork().getTotalUpload());
|
||||||
}
|
}
|
||||||
@ -180,6 +198,8 @@ const luaL_Reg networklib[] = {
|
|||||||
{"__recv", lua::wrap<l_recv>},
|
{"__recv", lua::wrap<l_recv>},
|
||||||
{"__is_alive", lua::wrap<l_is_alive>},
|
{"__is_alive", lua::wrap<l_is_alive>},
|
||||||
{"__is_connected", lua::wrap<l_is_connected>},
|
{"__is_connected", lua::wrap<l_is_connected>},
|
||||||
|
{"__get_address", lua::wrap<l_get_address>},
|
||||||
{"__is_serveropen", lua::wrap<l_is_serveropen>},
|
{"__is_serveropen", lua::wrap<l_is_serveropen>},
|
||||||
|
{"__get_serverport", lua::wrap<l_get_serverport>},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -244,10 +244,11 @@ static inline int sendsocket(
|
|||||||
return send(descriptor, buf, len, flags);
|
return send(descriptor, buf, len, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string to_string(const sockaddr_in* addr) {
|
static std::string to_string(const sockaddr_in& addr, bool port=true) {
|
||||||
char ip[INET_ADDRSTRLEN];
|
char ip[INET_ADDRSTRLEN];
|
||||||
if (inet_ntop(AF_INET, &(addr->sin_addr), ip, INET_ADDRSTRLEN)) {
|
if (inet_ntop(AF_INET, &(addr.sin_addr), ip, INET_ADDRSTRLEN)) {
|
||||||
return std::string(ip)+":"+std::to_string(htons(addr->sin_port));
|
return std::string(ip) +
|
||||||
|
(port ? (":" + std::to_string(htons(addr.sin_port))) : "");
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@ -266,7 +267,7 @@ class SocketConnection : public Connection {
|
|||||||
|
|
||||||
void connectSocket() {
|
void connectSocket() {
|
||||||
state = ConnectionState::CONNECTING;
|
state = ConnectionState::CONNECTING;
|
||||||
logger.info() << "connecting to " << to_string(&addr);
|
logger.info() << "connecting to " << to_string(addr);
|
||||||
int res = connectsocket(descriptor, (const sockaddr*)&addr, sizeof(sockaddr_in));
|
int res = connectsocket(descriptor, (const sockaddr*)&addr, sizeof(sockaddr_in));
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
auto error = handle_socket_error("Connect failed");
|
auto error = handle_socket_error("Connect failed");
|
||||||
@ -275,7 +276,7 @@ class SocketConnection : public Connection {
|
|||||||
logger.error() << error.what();
|
logger.error() << error.what();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
logger.info() << "connected to " << to_string(&addr);
|
logger.info() << "connected to " << to_string(addr);
|
||||||
state = ConnectionState::CONNECTED;
|
state = ConnectionState::CONNECTED;
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
@ -301,13 +302,13 @@ public:
|
|||||||
while (state == ConnectionState::CONNECTED) {
|
while (state == ConnectionState::CONNECTED) {
|
||||||
int size = recvsocket(descriptor, buffer.data(), buffer.size());
|
int size = recvsocket(descriptor, buffer.data(), buffer.size());
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
logger.info() << "closed connection with " << to_string(&addr);
|
logger.info() << "closed connection with " << to_string(addr);
|
||||||
closesocket(descriptor);
|
closesocket(descriptor);
|
||||||
state = ConnectionState::CLOSED;
|
state = ConnectionState::CLOSED;
|
||||||
break;
|
break;
|
||||||
} else if (size < 0) {
|
} else if (size < 0) {
|
||||||
logger.info() << "an error ocurred while receiving from "
|
logger.info() << "an error ocurred while receiving from "
|
||||||
<< to_string(&addr);
|
<< to_string(addr);
|
||||||
auto error = handle_socket_error("recv(...) error");
|
auto error = handle_socket_error("recv(...) error");
|
||||||
closesocket(descriptor);
|
closesocket(descriptor);
|
||||||
state = ConnectionState::CLOSED;
|
state = ConnectionState::CLOSED;
|
||||||
@ -321,7 +322,7 @@ public:
|
|||||||
}
|
}
|
||||||
totalDownload += size;
|
totalDownload += size;
|
||||||
}
|
}
|
||||||
logger.info() << "read " << size << " bytes from " << to_string(&addr);
|
logger.info() << "read " << size << " bytes from " << to_string(addr);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -380,6 +381,14 @@ public:
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getPort() const override {
|
||||||
|
return htons(addr.sin_port);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getAddress() const override {
|
||||||
|
return to_string(addr, false);
|
||||||
|
}
|
||||||
|
|
||||||
static std::shared_ptr<SocketConnection> connect(
|
static std::shared_ptr<SocketConnection> connect(
|
||||||
const std::string& address, int port, runnable callback
|
const std::string& address, int port, runnable callback
|
||||||
) {
|
) {
|
||||||
@ -421,9 +430,10 @@ class SocketTcpSServer : public TcpServer {
|
|||||||
std::mutex clientsMutex;
|
std::mutex clientsMutex;
|
||||||
bool open = true;
|
bool open = true;
|
||||||
std::unique_ptr<std::thread> thread = nullptr;
|
std::unique_ptr<std::thread> thread = nullptr;
|
||||||
|
int port;
|
||||||
public:
|
public:
|
||||||
SocketTcpSServer(Network* network, SOCKET descriptor)
|
SocketTcpSServer(Network* network, SOCKET descriptor, int port)
|
||||||
: network(network), descriptor(descriptor) {}
|
: network(network), descriptor(descriptor), port(port) {}
|
||||||
|
|
||||||
~SocketTcpSServer() {
|
~SocketTcpSServer() {
|
||||||
closeSocket();
|
closeSocket();
|
||||||
@ -445,7 +455,7 @@ public:
|
|||||||
close();
|
close();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
logger.info() << "client connected: " << to_string(&address);
|
logger.info() << "client connected: " << to_string(address);
|
||||||
auto socket = std::make_shared<SocketConnection>(
|
auto socket = std::make_shared<SocketConnection>(
|
||||||
clientDescriptor, address
|
clientDescriptor, address
|
||||||
);
|
);
|
||||||
@ -488,6 +498,11 @@ public:
|
|||||||
bool isOpen() override {
|
bool isOpen() override {
|
||||||
return open;
|
return open;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getPort() const override {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
static std::shared_ptr<SocketTcpSServer> openServer(
|
static std::shared_ptr<SocketTcpSServer> openServer(
|
||||||
Network* network, int port, consumer<u64id_t> handler
|
Network* network, int port, consumer<u64id_t> handler
|
||||||
) {
|
) {
|
||||||
@ -515,7 +530,8 @@ public:
|
|||||||
throw std::runtime_error("could not bind port "+std::to_string(port));
|
throw std::runtime_error("could not bind port "+std::to_string(port));
|
||||||
}
|
}
|
||||||
logger.info() << "opened server at port " << port;
|
logger.info() << "opened server at port " << port;
|
||||||
auto server = std::make_shared<SocketTcpSServer>(network, descriptor);
|
auto server =
|
||||||
|
std::make_shared<SocketTcpSServer>(network, descriptor, port);
|
||||||
server->startListen(std::move(handler));
|
server->startListen(std::move(handler));
|
||||||
return server;
|
return server;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,6 +46,9 @@ namespace network {
|
|||||||
virtual size_t pullUpload() = 0;
|
virtual size_t pullUpload() = 0;
|
||||||
virtual size_t pullDownload() = 0;
|
virtual size_t pullDownload() = 0;
|
||||||
|
|
||||||
|
virtual int getPort() const = 0;
|
||||||
|
virtual std::string getAddress() const = 0;
|
||||||
|
|
||||||
virtual ConnectionState getState() const = 0;
|
virtual ConnectionState getState() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -55,6 +58,7 @@ namespace network {
|
|||||||
virtual void startListen(consumer<u64id_t> handler) = 0;
|
virtual void startListen(consumer<u64id_t> handler) = 0;
|
||||||
virtual void close() = 0;
|
virtual void close() = 0;
|
||||||
virtual bool isOpen() = 0;
|
virtual bool isOpen() = 0;
|
||||||
|
virtual int getPort() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Network {
|
class Network {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user