aboutsummaryrefslogtreecommitdiff
path: root/src/libjin
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin')
-rw-r--r--src/libjin/3rdparty/tekcos/tekcos.c56
-rw-r--r--src/libjin/3rdparty/tekcos/tekcos.h6
-rw-r--r--src/libjin/Net/Socket.cpp53
-rw-r--r--src/libjin/Net/Socket.h17
4 files changed, 69 insertions, 63 deletions
diff --git a/src/libjin/3rdparty/tekcos/tekcos.c b/src/libjin/3rdparty/tekcos/tekcos.c
index a1fc94e..0eed75b 100644
--- a/src/libjin/3rdparty/tekcos/tekcos.c
+++ b/src/libjin/3rdparty/tekcos/tekcos.c
@@ -91,12 +91,11 @@ const char* tk_hltostr(uint32 ip)
/* TCP socket */
/********************************************/
-tk_TCPsocket* tk_tcp_open(tk_IPaddress ip)
+tk_TCPsocket tk_tcp_open(tk_IPaddress ip)
{
- tk_TCPsocket* sk;
- sk = (tk_TCPsocket*)malloc(sizeof(tk_TCPsocket));
- sk->id = socket(AF_INET, SOCK_STREAM, 0);
- if (sk->id == INVALID_SOCKET)
+ tk_TCPsocket sk;
+ sk.id = socket(AF_INET, SOCK_STREAM, 0);
+ if (sk.id == INVALID_SOCKET)
{
state = TK_COULDNETCREATESOCKET;
goto error;
@@ -115,36 +114,36 @@ tk_TCPsocket* tk_tcp_open(tk_IPaddress ip)
if (ip.host != INADDR_NONE && ip.host != INADDR_ANY)
{
addr.sin_addr.s_addr = htonl(ip.host);
- if (connect(sk->id, (const struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
+ if (connect(sk.id, (const struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
{
state = TK_CONNECTFAILED;
goto error;
}
- sk->type = SOCKET_TCLIENT;
+ sk.type = SOCKET_TCLIENT;
}
else
{
addr.sin_addr.s_addr = htonl(INADDR_ANY);
- if (bind(sk->id, (const struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
+ if (bind(sk.id, (const struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
{
state = TK_BINDSOCKETFAILED;
goto error;
}
- if (listen(sk->id, 8) == SOCKET_ERROR)
+ if (listen(sk.id, 8) == SOCKET_ERROR)
{
state = TK_LISTENSOCKETFAILED;
goto error;
}
- sk->type = SOCKET_TSERVER;
+ sk.type = SOCKET_TSERVER;
}
- sk->remote.host = ntohl(addr.sin_addr.s_addr);
- sk->remote.port = ntohs(addr.sin_port);
+ sk.remote.host = ntohl(addr.sin_addr.s_addr);
+ sk.remote.port = ntohs(addr.sin_port);
return sk;
error:
- return 0;
+ return sk;
}
int tk_tcp_close(tk_TCPsocket* sk)
@@ -217,10 +216,11 @@ error:
return 0;
}
-tk_TCPsocket* tk_tcp_accept(tk_TCPsocket* server)
+tk_TCPsocket tk_tcp_accept(tk_TCPsocket* server)
{
// client socket
- tk_TCPsocket* csk = (tk_TCPsocket*) malloc(sizeof(tk_TCPsocket));
+ tk_TCPsocket csk;
+ memset(&csk, 0, sizeof(csk));
if (server->type != SOCKET_TSERVER)
{
state = TK_WRONGSOCKETTPYE;
@@ -229,21 +229,21 @@ tk_TCPsocket* tk_tcp_accept(tk_TCPsocket* server)
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
int addr_len = sizeof(addr);
- csk->id = accept(server->id, (struct sockaddr *)&addr, &addr_len);
- if (csk->id == INVALID_SOCKET)
+ csk.id = accept(server->id, (struct sockaddr *)&addr, &addr_len);
+ if (csk.id == INVALID_SOCKET)
{
state = TK_INVALIDSOCKET;
goto error;
}
- csk->remote.host = ntohl(addr.sin_addr.s_addr);
- csk->remote.port = ntohs(addr.sin_port);
+ csk.remote.host = ntohl(addr.sin_addr.s_addr);
+ csk.remote.port = ntohs(addr.sin_port);
- csk->type = SOCKET_TCLIENT;
+ csk.type = SOCKET_TCLIENT;
return csk;
error:
- return 0;
+ return csk;
}
int tk_tcp_nonblocking(tk_TCPsocket* sk)
@@ -304,12 +304,12 @@ int tk_tcp_blocking(tk_TCPsocket* sk)
*
***************************************************/
-tk_UDPsocket* tk_udp_open(uint16 portnumber)
+tk_UDPsocket tk_udp_open(uint16 portnumber)
{
- tk_UDPsocket* sk;
- sk = (tk_UDPsocket*)malloc(sizeof(tk_UDPsocket));
- sk->id = socket(AF_INET, SOCK_DGRAM, 0);
- if (sk->id == INVALID_SOCKET)
+ tk_UDPsocket sk;
+ memset(&sk, 0, sizeof(sk));
+ sk.id = socket(AF_INET, SOCK_DGRAM, 0);
+ if (sk.id == INVALID_SOCKET)
{
state = TK_COULDNETCREATESOCKET;
goto error;
@@ -325,12 +325,12 @@ tk_UDPsocket* tk_udp_open(uint16 portnumber)
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(portnumber);
addr.sin_family = AF_INET;
- bind(sk->id, (const struct sockaddr*)&addr, sizeof(addr));
+ bind(sk.id, (const struct sockaddr*)&addr, sizeof(addr));
return sk;
}
error:
- return 0;
+ return sk;
}
int tk_udp_sendto(tk_UDPsocket* sk, tk_UDPpack* pack)
diff --git a/src/libjin/3rdparty/tekcos/tekcos.h b/src/libjin/3rdparty/tekcos/tekcos.h
index 0ec22fd..c78771a 100644
--- a/src/libjin/3rdparty/tekcos/tekcos.h
+++ b/src/libjin/3rdparty/tekcos/tekcos.h
@@ -55,11 +55,11 @@ typedef struct
// INADDR_ANY, creeate a listenning server socket,
// otherwise, connect to a remote server with given
// ip address.
-tk_TCPsocket* tk_tcp_open(tk_IPaddress ip);
+tk_TCPsocket tk_tcp_open(tk_IPaddress ip);
int tk_tcp_close(tk_TCPsocket* sk);
int tk_tcp_send(tk_TCPsocket* client, const void* buffer, int bsize, int* len);
int tk_tcp_recv(tk_TCPsocket* client, char* buffer, int bsize, int* len);
-tk_TCPsocket* tk_tcp_accept(tk_TCPsocket* server);
+tk_TCPsocket tk_tcp_accept(tk_TCPsocket* server);
int tk_tcp_nonblocking(tk_TCPsocket* sk);
int tk_tcp_blocking(tk_TCPsocket* sk);
@@ -82,7 +82,7 @@ typedef struct
char* data; // data
}tk_UDPpack;
-tk_UDPsocket* tk_udp_open(uint16 portnumber);
+tk_UDPsocket tk_udp_open(uint16 portnumber);
int tk_udp_close(tk_UDPsocket* sk);
int tk_udp_sendto(tk_UDPsocket* sk, tk_UDPpack* pack);
int tk_udp_recvfrom(tk_UDPsocket* sk, tk_UDPpack* pack);
diff --git a/src/libjin/Net/Socket.cpp b/src/libjin/Net/Socket.cpp
index 7e6fa7d..b28e4fc 100644
--- a/src/libjin/Net/Socket.cpp
+++ b/src/libjin/Net/Socket.cpp
@@ -4,22 +4,25 @@ namespace jin
{
namespace net
{
+ Socket::Socket(const Socket& socket)
+ : handle(socket.handle)
+ , type(socket.type)
+ {
+ }
Socket::Socket(const SocketInformation& info)
- : tcpHandle(nullptr)
- , udpHandle(nullptr)
+ : type(info.type)
{
- type = info.type;
if (type == SocketType::TCP)
{
tk_IPaddress ip;
ip.host = info.address;
ip.port = info.port;
- tcpHandle = tk_tcp_open(ip);
+ handle.tcpHandle = tk_tcp_open(ip);
}
else if (type == SocketType::UDP)
{
- udpHandle = tk_udp_open(info.port);
+ handle.udpHandle = tk_udp_open(info.port);
}
}
@@ -32,12 +35,12 @@ namespace net
#if JIN_NET_TEKCOS
ip.host = tk_strtohl(address);
ip.port = port;
- tcpHandle = tk_tcp_open(ip);
+ handle.tcpHandle = tk_tcp_open(ip);
#endif
}
else if (type == SocketType::UDP)
{
- udpHandle = tk_udp_open(port);
+ handle.udpHandle = tk_udp_open(port);
}
}
@@ -49,11 +52,11 @@ namespace net
tk_IPaddress ip;
ip.host = address;
ip.port = port;
- tcpHandle = tk_tcp_open(ip);
+ handle.tcpHandle = tk_tcp_open(ip);
}
else if (type == SocketType::UDP)
{
- udpHandle = tk_udp_open(port);
+ handle.udpHandle = tk_udp_open(port);
}
}
@@ -65,26 +68,24 @@ namespace net
tk_IPaddress ip;
ip.host = 0;
ip.port = port;
- tcpHandle = tk_tcp_open(ip);
+ handle.tcpHandle = tk_tcp_open(ip);
}
else if (type == SocketType::UDP)
{
- udpHandle = tk_udp_open(port);
+ handle.udpHandle = tk_udp_open(port);
}
}
#if JIN_NET_TEKCOS
- Socket::Socket(tk_TCPsocket* handle)
- : tcpHandle(handle)
- , udpHandle(nullptr)
+ Socket::Socket(tk_TCPsocket tcphandle)
{
+ handle.tcpHandle = tcphandle;
}
- Socket::Socket(tk_UDPsocket* handle)
- : tcpHandle(nullptr)
- , udpHandle(handle)
+ Socket::Socket(tk_UDPsocket udphandle)
{
+ handle.udpHandle = udphandle;
}
#endif // JIN_NET_TEKCOS
@@ -99,9 +100,9 @@ namespace net
return;
#if JIN_NET_TEKCOS
if (blocking)
- tk_tcp_blocking(tcpHandle);
+ tk_tcp_blocking(&handle.tcpHandle);
else
- tk_tcp_nonblocking(tcpHandle);
+ tk_tcp_nonblocking(&handle.tcpHandle);
#endif
}
@@ -111,7 +112,7 @@ namespace net
return nullptr;
Socket* client;
#if JIN_NET_TEKCOS
- tk_TCPsocket* socket = tk_tcp_accept(tcpHandle);
+ tk_TCPsocket socket = tk_tcp_accept(&handle.tcpHandle);
client = new Socket(socket);
#endif
return client;
@@ -123,7 +124,7 @@ namespace net
return 0;
#if JIN_NET_TEKCOS
int len;
- tk_tcp_recv(tcpHandle, buffer, size, &len);
+ tk_tcp_recv(&handle.tcpHandle, buffer, size, &len);
return len;
#endif
}
@@ -134,7 +135,7 @@ namespace net
return 0;
#if JIN_NET_TEKCOS
int len;
- tk_tcp_send(tcpHandle, buffer, size, &len);
+ tk_tcp_send(&handle.tcpHandle, buffer, size, &len);
return len;
#endif
}
@@ -149,7 +150,7 @@ namespace net
pack.len = size;
pack.ip.host = address;
pack.ip.port = port;
- tk_udp_sendto(udpHandle, &pack);
+ tk_udp_sendto(&handle.udpHandle, &pack);
#endif
}
@@ -164,7 +165,7 @@ namespace net
pack.len = size;
pack.ip.host = address;
pack.ip.port = port;
- tk_udp_recvfrom(udpHandle, &pack);
+ tk_udp_recvfrom(&handle.udpHandle, &pack);
return pack.len;
#endif
}
@@ -174,13 +175,13 @@ namespace net
if (type == SocketType::TCP)
{
#if JIN_NET_TEKCOS
- tk_tcp_close(tcpHandle);
+ tk_tcp_close(&handle.tcpHandle);
#endif
}
else if (type == SocketType::UDP)
{
#if JIN_NET_TEKCOS
- tk_udp_close(udpHandle);
+ tk_udp_close(&handle.udpHandle);
#endif
}
}
diff --git a/src/libjin/Net/Socket.h b/src/libjin/Net/Socket.h
index eb00605..720113e 100644
--- a/src/libjin/Net/Socket.h
+++ b/src/libjin/Net/Socket.h
@@ -26,6 +26,8 @@ namespace net
class Socket
{
public:
+ Socket() {};
+ Socket(const Socket& socket);
Socket(const SocketInformation& socketInformation);
Socket(SocketType type, unsigned short port);
Socket(SocketType type, unsigned int address, unsigned short port);
@@ -40,13 +42,16 @@ namespace net
int receiveFrom(char* buffer, int size, unsigned int address, unsigned int port);
void close();
- private:
+ protected:
#if JIN_NET_TEKCOS
- Socket(tk_TCPsocket* tcpHandle);
- Socket(tk_UDPsocket* udpHandle);
- tk_TCPsocket* tcpHandle;
- tk_UDPsocket* udpHandle;
- #endif
+ Socket(tk_TCPsocket tcpHandle);
+ Socket(tk_UDPsocket udpHandle);
+ union
+ {
+ tk_TCPsocket tcpHandle;
+ tk_UDPsocket udpHandle;
+ } handle;
+ #endif
SocketType type;
};