summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/base/main.c4
-rw-r--r--src/base/net_multiplayer.c38
-rw-r--r--src/base/net_multiplayer.h2
-rw-r--r--src/base/server.c113
-rw-r--r--src/base/server.h2
-rw-r--r--src/base/serverSelect.c90
-rw-r--r--src/base/serverSelect.h11
-rw-r--r--src/base/tcp_server.c165
-rw-r--r--src/base/tcp_server.h5
-rw-r--r--src/base/udp_server.c166
-rw-r--r--src/base/udp_server.h5
-rw-r--r--src/client/client.c153
-rwxr-xr-xsrc/net/tcp.c2
-rw-r--r--src/server/publicServer.c5
15 files changed, 439 insertions, 324 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 80a6099..5d353dc 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -3,7 +3,7 @@ SET ( WORKDIR ${CMAKE_SOURCE_DIR}/src )
# find ./ -maxdepth 1 -type f -name \*.c |grep "$" |sed -e 's/^\.\//\$\{WORKDIR\}\/DIR\//' -e 's/\.c//' |tr '\n' ' ' > DIRfiles
# nahradte DIR potrebnym adresarem a pak vemte vse co je v DIRfiles a vlozte to sem
SET ( SRC_base
-${WORKDIR}/base/main ${WORKDIR}/base/shot ${WORKDIR}/base/space ${WORKDIR}/base/checkFront ${WORKDIR}/base/storage ${WORKDIR}/base/myTimer ${WORKDIR}/base/protect ${WORKDIR}/base/list ${WORKDIR}/base/arena ${WORKDIR}/base/server ${WORKDIR}/base/udp_server ${WORKDIR}/base/tcp_server ${WORKDIR}/base/textFile ${WORKDIR}/base/gun ${WORKDIR}/base/arenaFile ${WORKDIR}/base/modules ${WORKDIR}/base/net_multiplayer ${WORKDIR}/base/index ${WORKDIR}/base/item ${WORKDIR}/base/tux ${WORKDIR}/base/director ${WORKDIR}/base/idManager ${WORKDIR}/base/homeDirector ${WORKDIR}/base/proto ${WORKDIR}/base/exportFunction ${WORKDIR}/base/buffer
+${WORKDIR}/base/main ${WORKDIR}/base/shot ${WORKDIR}/base/space ${WORKDIR}/base/checkFront ${WORKDIR}/base/storage ${WORKDIR}/base/myTimer ${WORKDIR}/base/protect ${WORKDIR}/base/list ${WORKDIR}/base/arena ${WORKDIR}/base/server ${WORKDIR}/base/udp_server ${WORKDIR}/base/tcp_server ${WORKDIR}/base/serverSelect ${WORKDIR}/base/textFile ${WORKDIR}/base/gun ${WORKDIR}/base/arenaFile ${WORKDIR}/base/modules ${WORKDIR}/base/net_multiplayer ${WORKDIR}/base/index ${WORKDIR}/base/item ${WORKDIR}/base/tux ${WORKDIR}/base/director ${WORKDIR}/base/idManager ${WORKDIR}/base/homeDirector ${WORKDIR}/base/proto ${WORKDIR}/base/exportFunction ${WORKDIR}/base/buffer
${WORKDIR}/net/udp ${WORKDIR}/net/tcp ${WORKDIR}/net/dns
)
diff --git a/src/base/main.c b/src/base/main.c
index 46f68ad..6221dd8 100644
--- a/src/base/main.c
+++ b/src/base/main.c
@@ -123,6 +123,10 @@ int WINAPI WinMain(
int main(int argc, char *argv[])
#endif
{
+#ifndef __WIN32__
+ signal(SIGPIPE, SIG_IGN);
+#endif
+
srand( (unsigned) time(NULL) );
#ifndef __WIN32__
diff --git a/src/base/net_multiplayer.c b/src/base/net_multiplayer.c
index f85d287..d0732d7 100644
--- a/src/base/net_multiplayer.c
+++ b/src/base/net_multiplayer.c
@@ -31,14 +31,19 @@ int getNetTypeGame()
return netGameType;
}
-#ifdef OLD_PUBLIC_SERVER
-
-int initNetMulitplayerPublicServer(char *ip4, int port4, char *ip6, int port6)
+int initNetMuliplayerForGameServer(char *ip4, int port4, char *ip6, int port6)
{
- netGameType = NET_GAME_TYPE_SERVER;
- return initUdpPublicServer(ip4, port4, ip6, port6);
+ int ret;
+
+ ret = initServer(ip4, port4, ip6, port6);
+
+ if( ret > 0 )
+ {
+ netGameType = NET_GAME_TYPE_SERVER;
+ }
+
+ return ret;
}
-#endif
int initNetMuliplayer(int type, char *ip, int port, int proto)
{
@@ -50,11 +55,24 @@ int initNetMuliplayer(int type, char *ip, int port, int proto)
break;
case NET_GAME_TYPE_SERVER :
- if( initServer(ip, port, proto) != 0 )
+ switch( proto )
{
- fprintf(stderr, "Unable to inicialize network game as server!\n");
- netGameType = NET_GAME_TYPE_NONE;
- return -1;
+ case PROTO_UDPv4 :
+ if( initServer(ip, port, NULL, 0) != 1 )
+ {
+ fprintf(stderr, "Unable to inicialize network game as server!\n");
+ netGameType = NET_GAME_TYPE_NONE;
+ return -1;
+ }
+ break;
+ case PROTO_UDPv6 :
+ if( initServer(NULL, 0, ip, port) != 1 )
+ {
+ fprintf(stderr, "Unable to inicialize network game as server!\n");
+ netGameType = NET_GAME_TYPE_NONE;
+ return -1;
+ }
+ break;
}
break;
diff --git a/src/base/net_multiplayer.h b/src/base/net_multiplayer.h
index 3137385..b7676c5 100644
--- a/src/base/net_multiplayer.h
+++ b/src/base/net_multiplayer.h
@@ -28,7 +28,7 @@
#define NET_MASTER_PORT 2200
#ifdef PUBLIC_SERVER
-extern int initNetMulitplayerPublicServer(char *ip4, int port4, char *ip6, int port6);
+extern int initNetMuliplayerForGameServer(char *ip4, int port4, char *ip6, int port6);
#endif
extern int initNetMuliplayer(int type, char *ip, int port, int proto);
diff --git a/src/base/server.c b/src/base/server.c
index b598810..fe01b5f 100644
--- a/src/base/server.c
+++ b/src/base/server.c
@@ -30,6 +30,7 @@
#include "checkFront.h"
#include "protect.h"
#include "index.h"
+#include "serverSelect.h"
#ifndef PUBLIC_SERVER
#include "screen_world.h"
@@ -40,14 +41,26 @@
#include "heightScore.h"
#endif
-#define SUPPORT_UDP
-
static list_t *listClient;
static list_t *listServerTimer;
static time_t timeUpdate;
static int maxClients;
+/*
+ TRAFFIC
+
+ za 5 sekund :
+
+ up : COUNT_PLAYERS * ( COUNT_PLAYERS - 1 ) * 1KB
+ down : COUNT_PLAYERS * 0.2KB
+
+ za 1 sekund :
+
+ up : COUNT_PLAYERS * ( COUNT_PLAYERS - 1 ) * 1/5 KB
+ down : COUNT_PLAYERS * 1/25 KB
+*/
+
typedef struct proto_cmd_server_struct
{
char *name;
@@ -147,21 +160,15 @@ void destroyAnyClient(client_t *p)
free(p);
}
-static void eventDelClient(client_t *client)
+static void destroyUdpOrTcpClient(client_t *client)
{
- int offset;
-
- offset = searchListItem(listClient, client);
-
- assert( offset != -1 );
-
switch( client->type )
{
case CLIENT_TYPE_UDP :
- delListItem(listClient, offset, destroyUdpClient);
+ destroyUdpClient(client);
break;
case CLIENT_TYPE_TCP :
- delListItem(listClient, offset, destroyTcpClient);
+ destroyTcpClient(client);
break;
default :
assert( ! "zly typ !");
@@ -169,6 +176,17 @@ static void eventDelClient(client_t *client)
}
}
+static void eventDelClientFromListClient(client_t *client)
+{
+ int offset;
+
+ offset = searchListItem(listClient, client);
+
+ assert( offset != -1 );
+
+ delListItem(listClient, offset, destroyUdpOrTcpClient);
+}
+
static void delZombieCLient(void *p_nothink)
{
client_t *thisClient;
@@ -195,7 +213,7 @@ static void delZombieCLient(void *p_nothink)
proto_send_del_server(PROTO_SEND_ALL, NULL, thisClient->tux->id);
}
- eventDelClient(thisClient);
+ eventDelClientFromListClient(thisClient);
i--;
}
}
@@ -208,7 +226,7 @@ static void eventPeriodicSyncClient(void *p_nothink)
int i;
#ifndef PUBLIC_SERVER
- proto_send_newtux_server(PROTO_SEND_ALL_SEES_TUX, NULL, getControlTux(TUX_CONTROL_KEYBOARD_RIGHT));
+ proto_send_newtux_server(PROTO_SEND_ALL_SEES_TUX, NULL, getControlTux(TUX_CONTROL_KEYBOARD_RIGHT));
#endif
for( i = 0 ; i < listClient->count; i++ )
@@ -246,7 +264,7 @@ void setServerTimer()
addTaskToTimer(listServerTimer, TIMER_PERIODIC, eventSendPingClients, NULL, SERVER_TIME_PING);
}
-int initServer(char *ip, int port, int proto)
+int initServer(char *ip4, int port4, char *ip6, int port6)
{
int ret;
@@ -258,13 +276,20 @@ int initServer(char *ip, int port, int proto)
setServerMaxClients(SERVER_MAX_CLIENTS);
setServerTimer();
-#ifdef SUPPORT_UDP
- ret = initUdpServer(ip, port, proto);
-#endif
+ ret = initUdpServer(ip4, port4, ip6, port6);
+
+ if( ret == 0 )
+ {
+ return -1;
+ }
+
+ ret = initTcpServer(ip4, port4, ip6, port6);
+
+ if( ret == 0 )
+ {
+ return -1;
+ }
-#ifdef SUPPORT_TCP
- ret = initTcpServer(ip, port, proto);
-#endif
return ret;
}
@@ -532,12 +557,39 @@ static void eventClientListBuffer()
void eventServer()
{
-#ifdef SUPPORT_UDP
- eventUdpServer();
+#ifndef PUBLIC_SERVER
+ int count;
+
+ do{
+ restartSelect();
+ setServerTcpSelect();
+ actionSelect();
+ count = selectServerTcpSocket();
+ }while( count > 0 );
+
+ do{
+ restartSelect();
+ setServerUdpSelect();
+ actionSelect();
+ count = selectServerUdpSocket();
+ }while( count > 0 );
#endif
-#ifdef SUPPORT_TCP
- eventTcpServer();
+#ifdef PUBLIC_SERVER
+ int ret;
+
+ restartSelect();
+
+ setServerTcpSelect();
+ setServerUdpSelect();
+
+ ret = actionSelect();
+
+ if( ret > 0 )
+ {
+ selectServerTcpSocket();
+ selectServerUdpSocket();
+ }
#endif
eventClientListBuffer();
@@ -550,21 +602,10 @@ void quitServer()
assert( listClient != NULL );
-#ifdef SUPPORT_UDP
- destroyListItem(listClient, destroyUdpClient);
-#endif
-
-#ifdef SUPPORT_TCP
- destroyListItem(listClient, destroyTcpClient);
-#endif
+ destroyListItem(listClient, destroyUdpOrTcpClient);
destroyTimer(listServerTimer);
-#ifdef SUPPORT_UDP
quitUdpServer();
-#endif
-
-#ifdef SUPPORT_TCP
quitTcpServer();
-#endif
}
diff --git a/src/base/server.h b/src/base/server.h
index 61d9333..0e5ed6b 100644
--- a/src/base/server.h
+++ b/src/base/server.h
@@ -47,7 +47,7 @@ typedef struct client_struct
list_t *listSeesShot;
} client_t;
-extern int initServer(char *ip, int port, int proto);
+extern int initServer(char *ip4, int port4, char *ip6, int port6);
extern time_t getUpdateServer();
extern client_t* newAnyClient();
extern void destroyAnyClient(client_t *p);
diff --git a/src/base/serverSelect.c b/src/base/serverSelect.c
new file mode 100644
index 0000000..99505d5
--- /dev/null
+++ b/src/base/serverSelect.c
@@ -0,0 +1,90 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sys/types.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/time.h>
+
+#ifndef __WIN32__
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/select.h>
+#else
+#include <io.h>
+#include <winsock2.h>
+#endif
+
+#include "server.h"
+
+static struct timeval tv;
+static fd_set readfds;
+static int max_fd;
+
+void restartSelect()
+{
+#ifndef PUBLIC_SERVER
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+#endif
+
+#ifdef PUBLIC_SERVER
+ tv.tv_sec = 0;
+ tv.tv_usec = 1000;
+#endif
+
+ FD_ZERO(&readfds);
+ max_fd = 0;
+}
+
+void addSockToSelect(int sock)
+{
+ //printf("addSockToSelect %d\n", sock);
+
+ FD_SET(sock, &readfds);
+
+ if(sock > max_fd )
+ {
+ max_fd = sock;
+ }
+}
+
+int actionSelect()
+{
+ int ret;
+
+#ifdef PUBLIC_SERVER
+ list_t *listClient;
+ listClient = getListServerClient();
+
+ if( listClient->count == 0 )
+ {
+ ret = select(max_fd+1, &readfds, (fd_set *)NULL, (fd_set *)NULL, NULL);
+ setServerTimer();
+ }
+ else
+ {
+ ret = select(max_fd+1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &tv);
+ }
+#endif
+
+#ifndef PUBLIC_SERVER
+ ret = select(max_fd+1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &tv);
+#endif
+
+ return ret;
+}
+
+int isChangeSockInSelect(int sock)
+{
+ int ret;
+
+ ret = FD_ISSET(sock, &readfds);
+
+ //printf("isChangeSockInSelect %d -> %d\n", sock, ret);
+
+ return ret;
+}
diff --git a/src/base/serverSelect.h b/src/base/serverSelect.h
new file mode 100644
index 0000000..332a4da
--- /dev/null
+++ b/src/base/serverSelect.h
@@ -0,0 +1,11 @@
+
+#ifndef SERVER_SELECT
+
+#define SERVER_SELECT
+
+extern void restartSelect();
+extern void addSockToSelect(int sock);
+extern int actionSelect();
+extern int isChangeSockInSelect(int sock);
+
+#endif
diff --git a/src/base/tcp_server.c b/src/base/tcp_server.c
index 77d8592..b201235 100644
--- a/src/base/tcp_server.c
+++ b/src/base/tcp_server.c
@@ -40,6 +40,7 @@
#include "tcp.h"
#include "tcp_server.h"
+#include "serverSelect.h"
static sock_tcp_t *sock_server_tcp;
static sock_tcp_t *sock_server_tcp_second;
@@ -69,7 +70,7 @@ void destroyTcpClient(client_t *p)
eventMsgInCheckFront(p);
getSockTcpIp(p->socket_tcp, str_ip, STR_IP_SIZE);
- printf("closeTCP connect %s %d\n", str_ip, getSockTcpPort(p->socket_tcp) );
+ printf("close TCP connect %s %d\n", str_ip, getSockTcpPort(p->socket_tcp) );
closeTcpSocket(p->socket_tcp);
destroyBuffer(p->buffer);
@@ -77,20 +78,45 @@ void destroyTcpClient(client_t *p)
destroyAnyClient(p);
}
-int initTcpServer(char *ip, int port, int proto)
+int initTcpServer(char *ip4, int port4, char *ip6, int port6)
{
- sock_server_tcp = bindTcpSocket(ip, port, proto);
- sock_server_tcp_second = NULL;
+ int ret;
+
+ ret = 0;
- if( sock_server_tcp == NULL )
+ if( ip4 != NULL )
{
- return -1;
+ sock_server_tcp = bindTcpSocket(ip4, port4, PROTO_UDPv4);
+
+ if( sock_server_tcp != NULL )
+ {
+ ret++;
+ disableNagle(sock_server_tcp);
+ printf("server listen TCP port %s %d\n", ip4, port4);
+ }
+ else
+ {
+ printf("server listen TCP port %s %d -- failed !!!\n", ip4, port4);
+ }
}
- disableNagle(sock_server_tcp);
- printf("server listen TCP port %s %d\n", ip, port);
+ if( ip6 != NULL )
+ {
+ sock_server_tcp_second = bindTcpSocket(ip6, port6, PROTO_UDPv6);
- return 0;
+ if( sock_server_tcp_second != NULL )
+ {
+ ret++;
+ disableNagle(sock_server_tcp_second);
+ printf("server listen TCP port %s %d\n", ip6, port6);
+ }
+ else
+ {
+ printf("server listen TCP port %s %d -- failed !!!\n", ip6, port6);
+ }
+ }
+
+ return ret;
}
static void eventNewClient(sock_tcp_t *server_sock)
@@ -129,44 +155,21 @@ static void eventTcpClient(client_t *client)
}
}
-static int selectServerTcpSocket()
+void setServerTcpSelect()
{
list_t *listClient;
- struct timeval tv;
- fd_set readfds;
- fd_set errorfds;
- int max_fd;
- int ret;
- int count;
int i;
listClient = getListServerClient();
-#ifndef PUBLIC_SERVER
- tv.tv_sec = 0;
- tv.tv_usec = 0;
-#endif
-
-#ifdef PUBLIC_SERVER
- tv.tv_sec = 0;
- tv.tv_usec = 1000;
-#endif
-
- FD_ZERO(&readfds);
- FD_ZERO(&errorfds);
-
- max_fd = 0;
- count = 0;
-
if( sock_server_tcp != NULL )
{
- FD_SET(sock_server_tcp->sock, &errorfds);
- FD_SET(sock_server_tcp->sock, &readfds);
+ addSockToSelect(sock_server_tcp->sock);
+ }
- if( sock_server_tcp->sock > max_fd )
- {
- max_fd = sock_server_tcp->sock;
- }
+ if( sock_server_tcp_second != NULL )
+ {
+ addSockToSelect(sock_server_tcp_second->sock);
}
for( i = 0 ; i < listClient->count ; i++ )
@@ -175,99 +178,65 @@ static int selectServerTcpSocket()
client = (client_t *)listClient->list[i];
- if( client->status != NET_STATUS_OK )
+ if( client->status != NET_STATUS_OK || client->type != CLIENT_TYPE_TCP )
{
continue;
}
- FD_SET(client->socket_tcp->sock, &errorfds);
- FD_SET(client->socket_tcp->sock, &readfds);
-
- if( client->socket_tcp->sock > max_fd )
- {
- max_fd = client->socket_tcp->sock;
- }
+ addSockToSelect(client->socket_tcp->sock);
}
+}
+int selectServerTcpSocket()
+{
+ list_t *listClient;
+ int count;
+ int i;
-#ifdef PUBLIC_SERVER
- if( listClient->count == 0 )
- {
- ret = select(max_fd+1, &readfds, (fd_set *)NULL, &errorfds, NULL);
- setServerTimer();
- }
- else
- {
- ret = select(max_fd+1, &readfds, (fd_set *)NULL,&errorfds, &tv);
- }
-#endif
-
-#ifndef PUBLIC_SERVER
- ret = select(max_fd+1, &readfds, (fd_set *)NULL,&errorfds, &tv);
-#endif
+ count = 0;
- if( ret < 0 )
- {
- //printf("select ret = %d\n", ret);
- return 0;
- }
-
if( sock_server_tcp != NULL )
{
- if( FD_ISSET(sock_server_tcp->sock, &readfds) )
+ if( isChangeSockInSelect(sock_server_tcp->sock) )
{
eventNewClient(sock_server_tcp);
- count = 1;
+ count++;
}
-
- if( FD_ISSET(sock_server_tcp->sock, &errorfds) )
+ }
+
+ if( sock_server_tcp_second != NULL )
+ {
+ if( isChangeSockInSelect(sock_server_tcp_second->sock) )
{
- printf("error\n");
+ eventNewClient(sock_server_tcp_second);
+ count++;
}
}
+ listClient = getListServerClient();
+
for( i = 0 ; i < listClient->count ; i++ )
{
client_t *client;
client = (client_t *)listClient->list[i];
- if( FD_ISSET(client->socket_tcp->sock, &readfds) )
+ if( client->status != NET_STATUS_OK || client->type != CLIENT_TYPE_TCP )
{
- //printf("eventTcpClient(client);\n");
- eventTcpClient(client);
- count = 1;
+ continue;
}
- if( FD_ISSET(client->socket_tcp->sock, &errorfds) )
+ if( isChangeSockInSelect(client->socket_tcp->sock) )
{
- //printf("error client\n");
- count = 1;
+ //printf("eventTcpClient(client);\n");
+ eventTcpClient(client);
+ count++;
}
}
return count;
}
-void eventTcpServer()
-{
-#ifndef PUBLIC_SERVER
-
- int count;
-
-#ifdef SUPPORT_NET_UNIX_UDP
- do{
- count = selectServerTcpSocket();
- }while( count > 0 );
-#endif
-
-#endif
-
-#ifdef PUBLIC_SERVER
- selectServerTcpSocket();
-#endif
-}
-
void quitTcpServer()
{
if( sock_server_tcp != NULL )
diff --git a/src/base/tcp_server.h b/src/base/tcp_server.h
index d4dee0a..6cae061 100644
--- a/src/base/tcp_server.h
+++ b/src/base/tcp_server.h
@@ -8,8 +8,9 @@
extern client_t* newTcpClient(sock_tcp_t *sock_tcp);
extern void destroyTcpClient(client_t *p);
-extern int initTcpServer(char *ip, int port, int proto);
-extern void eventTcpServer();
+extern int initTcpServer(char *ip4, int port4, char *ip6, int port6);
+extern void setServerTcpSelect();
+extern int selectServerTcpSocket();
extern void quitTcpServer();
#endif
diff --git a/src/base/udp_server.c b/src/base/udp_server.c
index cb0aaba..63a24ea 100644
--- a/src/base/udp_server.c
+++ b/src/base/udp_server.c
@@ -40,6 +40,7 @@
#include "udp.h"
#include "udp_server.h"
+#include "serverSelect.h"
static sock_udp_t *sock_server_udp;
static sock_udp_t *sock_server_udp_second;
@@ -75,59 +76,45 @@ void destroyUdpClient(client_t *p)
destroyAnyClient(p);
}
-int initUdpServer(char *ip, int port, int proto)
+int initUdpServer(char *ip4, int port4, char *ip6, int port6)
{
- sock_server_udp = bindUdpSocket(ip, port, proto);
- sock_server_udp_second = NULL;
-
- if( sock_server_udp == NULL )
- {
- return -1;
- }
-
- printf("server listen UDP port %s %d\n", ip, port);
-
- return 0;
-}
+ int ret;
-#ifdef OLD_PUBLIC_SERVER
-
-int initUdpPublicServer(char *ip4, int port4, char *ip6, int port6)
-{
- sock_server_udp = NULL;
- sock_server_udp_second = NULL;
+ ret = 0;
if( ip4 != NULL )
{
sock_server_udp = bindUdpSocket(ip4, port4, PROTO_UDPv4);
-
- if( sock_server_udp == NULL )
+
+ if( sock_server_udp != NULL )
{
- return -1;
+ ret++;
+ printf("server listen UDP port %s %d\n", ip4, port4);
+ }
+ else
+ {
+ printf("server listen UDP port %s %d -- failed !!!\n", ip4, port4);
}
-
- printf("server listen UDP port %s %d\n", ip4, port4);
}
if( ip6 != NULL )
{
sock_server_udp_second = bindUdpSocket(ip6, port6, PROTO_UDPv6);
-
- if( sock_server_udp_second == NULL )
+
+ if( sock_server_udp_second != NULL )
{
- return -1;
+ ret++;
+ printf("server listen UDP port %s %d\n", ip6, port6);
+ }
+ else
+ {
+ printf("server listen UDP port %s %d -- failed !!!\n", ip6, port6);
}
-
- printf("server listen UDP port %s %d\n", ip6, port6);
}
- initServer();
-
- return 0;
+ return ret;
}
-#endif
-
static void eventCreateNewUdpClient(sock_udp_t *socket_udp)
{
list_t *listClient;
@@ -156,7 +143,8 @@ static client_t* findUdpClient(sock_udp_t *sock_udp)
client = (client_t *)listClient->list[i];
- if( getSockUdpPort(client->socket_udp) == port )
+ if( client->type == CLIENT_TYPE_UDP &&
+ getSockUdpPort(client->socket_udp) == port )
{
return client;
}
@@ -218,130 +206,46 @@ static void eventClientUdpSelect(sock_udp_t *sock_server)
addList(client->listRecvMsg, strdup(listRecvMsg) );
}
-static int selectServerUdpSocket()
+void setServerUdpSelect()
{
- struct timeval tv;
- fd_set readfds;
- fd_set errorfds;
- int max_fd;
- int ret;
- int count;
-
-#ifndef PUBLIC_SERVER
- tv.tv_sec = 0;
- tv.tv_usec = 0;
-#endif
-
-#ifdef PUBLIC_SERVER
- tv.tv_sec = 0;
- tv.tv_usec = 1000;
-#endif
-
- FD_ZERO(&readfds);
- FD_ZERO(&errorfds);
-
- max_fd = 0;
- count = 0;
-
if( sock_server_udp != NULL )
{
- FD_SET(sock_server_udp->sock, &errorfds);
- FD_SET(sock_server_udp->sock, &readfds);
-
- if( sock_server_udp->sock > max_fd )
- {
- max_fd = sock_server_udp->sock;
- }
+ addSockToSelect(sock_server_udp->sock);
}
if( sock_server_udp_second != NULL )
{
- FD_SET(sock_server_udp_second->sock, &readfds);
- FD_SET(sock_server_udp_second->sock, &errorfds);
-
- if( sock_server_udp_second->sock > max_fd )
- {
- max_fd = sock_server_udp_second->sock;
- }
+ addSockToSelect(sock_server_udp_second->sock);
}
+}
- //printf("select..\n");
-
-#ifdef PUBLIC_SERVER
- list_t *listClient;
- listClient = getListServerClient();
-
- if( listClient->count == 0 )
- {
- ret = select(max_fd+1, &readfds, (fd_set *)NULL, &errorfds, NULL);
- setServerTimer();
- }
- else
- {
- ret = select(max_fd+1, &readfds, (fd_set *)NULL,&errorfds, &tv);
- }
-#endif
+int selectServerUdpSocket()
+{
+ int count;
-#ifndef PUBLIC_SERVER
- ret = select(max_fd+1, &readfds, (fd_set *)NULL,&errorfds, &tv);
-#endif
+ count = 0;
- if( ret < 0 )
- {
- //printf("select ret = %d\n", ret);
- return 0;
- }
-
if( sock_server_udp != NULL )
{
- if( FD_ISSET(sock_server_udp->sock, &readfds) )
+ if( isChangeSockInSelect(sock_server_udp->sock) )
{
eventClientUdpSelect(sock_server_udp);
- count = 1;
- }
-
- if( FD_ISSET(sock_server_udp->sock, &errorfds) )
- {
- printf("error\n");
+ count++;
}
}
if( sock_server_udp_second != NULL )
{
- if( FD_ISSET(sock_server_udp_second->sock, &readfds) )
+ if( isChangeSockInSelect(sock_server_udp_second->sock) )
{
eventClientUdpSelect(sock_server_udp_second);
- count = 1;
- }
-
- if( FD_ISSET(sock_server_udp_second->sock, &errorfds) )
- {
- printf("error\n");
+ count++;
}
}
return count;
}
-void eventUdpServer()
-{
-#ifndef PUBLIC_SERVER
-
- int count;
-
-#ifdef SUPPORT_NET_UNIX_UDP
- do{
- count = selectServerUdpSocket();
- }while( count > 0 );
-#endif
-
-#endif
-
-#ifdef PUBLIC_SERVER
- selectServerUdpSocket();
-#endif
-}
-
void quitUdpServer()
{
if( sock_server_udp != NULL )
diff --git a/src/base/udp_server.h b/src/base/udp_server.h
index 58bb018..576e63d 100644
--- a/src/base/udp_server.h
+++ b/src/base/udp_server.h
@@ -8,8 +8,9 @@
extern client_t* newUdpClient(sock_udp_t *sock_udp);
extern void destroyUdpClient(client_t *p);
-extern int initUdpServer(char *ip, int port, int proto);
-extern void eventUdpServer();
+extern int initUdpServer(char *ip4, int port4, char *ip6, int port6);
+extern void setServerUdpSelect();
+extern int selectServerUdpSocket();
extern void quitUdpServer();
#endif
diff --git a/src/client/client.c b/src/client/client.c
index f6dbe3b..789233e 100644
--- a/src/client/client.c
+++ b/src/client/client.c
@@ -31,8 +31,6 @@
#include "tcp.h"
#include "buffer.h"
-#define SUPPORT_UDP
-
static sock_udp_t *sock_server_udp;
static sock_tcp_t *sock_server_tcp;
@@ -41,6 +39,12 @@ static buffer_t *clientBuffer;
static my_time_t lastPing;
static my_time_t lastPingServerAlive;
+#ifdef SUPPORT_TRAFFIC
+static my_time_t lastTraffic;
+static int traffic_down;
+static int traffic_up;
+#endif
+
typedef struct proto_cmd_client_struct
{
char *name;
@@ -125,19 +129,43 @@ int initClient(char *ip, int port, int proto)
listRecvMsg = newList();
lastPing = getMyTime();
lastPingServerAlive = getMyTime();
- clientBuffer = newBuffer(4096);
-#ifdef SUPPORT_UDP
- ret = initUdpClient(ip, port, proto);
+#ifdef SUPPORT_TRAFFIC
+ lastTraffic = getMyTime();
+ traffic_down = 0;
+ traffic_up = 0;
#endif
-#ifdef SUPPORT_TCP
- ret = initTcpClient(ip, port, proto);
-#endif
+ clientBuffer = newBuffer(4096);
- if( ret < 0 )
+ if( ! isParamFlag("--udp") && ! isParamFlag("--tcp") )
{
- return -1;
+ ret = initUdpClient(ip, port, proto);
+
+ if( ret < 0 )
+ {
+ return -1;
+ }
+ }
+
+ if( isParamFlag("--udp") && ! isParamFlag("--tcp") )
+ {
+ ret = initUdpClient(ip, port, proto);
+
+ if( ret < 0 )
+ {
+ return -1;
+ }
+ }
+
+ if( isParamFlag("--tcp") && ! isParamFlag("--udp") )
+ {
+ ret = initTcpClient(ip, port, proto);
+
+ if( ret < 0 )
+ {
+ return -1;
+ }
}
getSettingNameRight(name);
@@ -157,15 +185,22 @@ void sendServer(char *msg)
{
printf("send -> %s", msg);
}
-#endif
-#ifdef SUPPORT_UDP
- ret = writeUdpSocket(sock_server_udp, sock_server_udp, msg, strlen(msg));
#endif
-#ifdef SUPPORT_TCP
- ret = writeTcpSocket(sock_server_tcp, msg, strlen(msg));
+#ifdef SUPPORT_TRAFFIC
+ traffic_up += strlen(msg);
#endif
+
+ if( sock_server_udp != NULL )
+ {
+ ret = writeUdpSocket(sock_server_udp, sock_server_udp, msg, strlen(msg));
+ }
+
+ if( sock_server_tcp != NULL )
+ {
+ ret = writeTcpSocket(sock_server_tcp, msg, strlen(msg));
+ }
}
static int eventServerSelect()
@@ -175,19 +210,25 @@ static int eventServerSelect()
memset(buffer, 0, STR_PROTO_SIZE);
-#ifdef SUPPORT_UDP
- ret = readUdpSocket(sock_server_udp, sock_server_udp, buffer, STR_PROTO_SIZE-1);
-#endif
+ if( sock_server_udp != NULL )
+ {
+ ret = readUdpSocket(sock_server_udp, sock_server_udp, buffer, STR_PROTO_SIZE-1);
+ }
-#ifdef SUPPORT_TCP
- ret = readTcpSocket(sock_server_tcp, buffer, STR_PROTO_SIZE-1);
-#endif
+ if( sock_server_tcp != NULL )
+ {
+ ret = readTcpSocket(sock_server_tcp, buffer, STR_PROTO_SIZE-1);
+ }
if( ret <= 0 )
{
return ret;
}
+#ifdef SUPPORT_TRAFFIC
+ traffic_down += ret;
+#endif
+
addBuffer(clientBuffer, buffer, ret);
while( getBufferLine(clientBuffer, buffer, STR_PROTO_SIZE) >= 0 )
@@ -268,12 +309,15 @@ static void selectClientSocket()
int sock;
bool_t isNext;
- if( isServerAlive() == FALSE )
+ if( sock_server_udp != NULL )
{
- fprintf(stderr, "Server does not respond!\n");
- setMsgToAnalyze(getMyText("ERROR_SERVER_DONT_ALIVE"));
- setWorldEnd();
- return;
+ if( isServerAlive() == FALSE )
+ {
+ fprintf(stderr, "Server does not respond!\n");
+ setMsgToAnalyze(getMyText("ERROR_SERVER_DONT_ALIVE"));
+ setWorldEnd();
+ return;
+ }
}
do{
@@ -284,13 +328,15 @@ static void selectClientSocket()
FD_ZERO(&readfds);
-#ifdef SUPPORT_UDP
- sock = sock_server_udp->sock;
-#endif
-
-#ifdef SUPPORT_TCP
- sock = sock_server_tcp->sock;
-#endif
+ if( sock_server_udp != NULL )
+ {
+ sock = sock_server_udp->sock;
+ }
+
+ if( sock_server_tcp != NULL )
+ {
+ sock = sock_server_tcp->sock;
+ }
FD_SET(sock, &readfds);
max_fd = sock;
@@ -307,8 +353,35 @@ static void selectClientSocket()
}while( isNext == TRUE );
}
+#ifdef SUPPORT_TRAFFIC
+
+static void eventTraffic()
+{
+ my_time_t currentTime;
+
+ currentTime = getMyTime();
+
+ if( currentTime - lastTraffic > 5000 )
+ {
+ lastTraffic = currentTime;
+
+ printf("down: %d\n"
+ "up : %d\n",
+ traffic_down, traffic_up);
+
+ traffic_down = 0;
+ traffic_up = 0;
+ }
+}
+
+#endif
+
void eventClient()
{
+#ifdef SUPPORT_TRAFFIC
+ eventTraffic();
+#endif
+
eventPingServer();
selectClientSocket();
eventServerBuffer();
@@ -337,12 +410,14 @@ void quitClient()
destroyListItem(listRecvMsg, free);
destroyBuffer(clientBuffer);
-#ifdef SUPPORT_UDP
- quitUdpClient();
-#endif
+ if( sock_server_udp != NULL )
+ {
+ quitUdpClient();
+ }
-#ifdef SUPPORT_TCP
- quitTcpClient();
-#endif
+ if( sock_server_tcp != NULL )
+ {
+ quitTcpClient();
+ }
}
diff --git a/src/net/tcp.c b/src/net/tcp.c
index 2df17b9..1c3f6c0 100755
--- a/src/net/tcp.c
+++ b/src/net/tcp.c
@@ -260,6 +260,7 @@ int disableNagle(sock_tcp_t *p)
(char *) &flag, /* the cast is historical cruft */
sizeof(int)); /* length of option value */
+#if 0
if( result < 0 )
{
printf("disabled nagle error\n");
@@ -268,6 +269,7 @@ int disableNagle(sock_tcp_t *p)
{
printf("disabled nagle OK\n");
}
+#endif
return result;
}
diff --git a/src/server/publicServer.c b/src/server/publicServer.c
index 637ac54..7d434d7 100644
--- a/src/server/publicServer.c
+++ b/src/server/publicServer.c
@@ -222,7 +222,7 @@ static int initPublicServerNetwork()
if( strcmp(ip6, "none") == 0 )
{
- p_ip6= NULL;
+ p_ip6 = NULL;
}
port4 = atoi( getSetting("PORTv4", "--port", "2200") );
@@ -230,7 +230,7 @@ static int initPublicServerNetwork()
//ret = initNetMulitplayerPublicServer(p_ip4, port4, p_ip6, port6);
- ret = initNetMuliplayer(NET_GAME_TYPE_SERVER, p_ip4, port4, PROTO_TCPv4);
+ ret = initNetMuliplayerForGameServer(p_ip4, port4, p_ip6, port6);
return ret;
}
@@ -343,7 +343,6 @@ void quitPublicServer()
int startPublicServer()
{
#ifndef __WIN32__
- signal(SIGPIPE, SIG_IGN);
signal(SIGINT, my_handler_quit);
signal(SIGTERM, my_handler_quit);
signal(SIGQUIT, my_handler_quit);