mirror of https://github.com/OpenTTD/OpenTTD
(svn r15973) -Codechange: make it possible to listen on multiple TCP sockets
parent
c0f8214218
commit
8cf88876ef
|
@ -79,7 +79,7 @@ extern NetworkUDPSocketHandler *_udp_server_socket; ///< udp server socket
|
||||||
extern NetworkUDPSocketHandler *_udp_master_socket; ///< udp master socket
|
extern NetworkUDPSocketHandler *_udp_master_socket; ///< udp master socket
|
||||||
|
|
||||||
/* The listen socket for the server */
|
/* The listen socket for the server */
|
||||||
static SOCKET _listensocket;
|
static SocketList _listensockets;
|
||||||
|
|
||||||
/* The amount of clients connected */
|
/* The amount of clients connected */
|
||||||
static byte _network_clients_connected = 0;
|
static byte _network_clients_connected = 0;
|
||||||
|
@ -470,19 +470,16 @@ void NetworkCloseClient(NetworkClientSocket *cs)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For the server, to accept new clients */
|
/* For the server, to accept new clients */
|
||||||
static void NetworkAcceptClients()
|
static void NetworkAcceptClients(SOCKET ls)
|
||||||
{
|
{
|
||||||
NetworkClientSocket *cs;
|
NetworkClientSocket *cs;
|
||||||
bool banned;
|
bool banned;
|
||||||
|
|
||||||
/* Should never ever happen.. is it possible?? */
|
|
||||||
assert(_listensocket != INVALID_SOCKET);
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
struct sockaddr_storage sin;
|
struct sockaddr_storage sin;
|
||||||
memset(&sin, 0, sizeof(sin));
|
memset(&sin, 0, sizeof(sin));
|
||||||
socklen_t sin_len = sizeof(sin);
|
socklen_t sin_len = sizeof(sin);
|
||||||
SOCKET s = accept(_listensocket, (struct sockaddr*)&sin, &sin_len);
|
SOCKET s = accept(ls, (struct sockaddr*)&sin, &sin_len);
|
||||||
if (s == INVALID_SOCKET) return;
|
if (s == INVALID_SOCKET) return;
|
||||||
|
|
||||||
SetNonBlocking(s); // XXX error handling?
|
SetNonBlocking(s); // XXX error handling?
|
||||||
|
@ -535,18 +532,17 @@ static void NetworkAcceptClients()
|
||||||
/* Set up the listen socket for the server */
|
/* Set up the listen socket for the server */
|
||||||
static bool NetworkListen()
|
static bool NetworkListen()
|
||||||
{
|
{
|
||||||
|
assert(_listensockets.Length() == 0);
|
||||||
|
|
||||||
NetworkAddress address(_settings_client.network.server_bind_ip, _settings_client.network.server_port);
|
NetworkAddress address(_settings_client.network.server_bind_ip, _settings_client.network.server_port);
|
||||||
|
|
||||||
DEBUG(net, 1, "Listening on %s", address.GetAddressAsString());
|
address.Listen(SOCK_STREAM, &_listensockets);
|
||||||
|
|
||||||
SOCKET ls = address.Listen(SOCK_STREAM);
|
if (_listensockets.Length() == 0) {
|
||||||
if (ls == INVALID_SOCKET) {
|
|
||||||
ServerStartError("Could not create listening socket");
|
ServerStartError("Could not create listening socket");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_listensocket = ls;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -574,8 +570,10 @@ static void NetworkClose()
|
||||||
|
|
||||||
if (_network_server) {
|
if (_network_server) {
|
||||||
/* We are a server, also close the listensocket */
|
/* We are a server, also close the listensocket */
|
||||||
closesocket(_listensocket);
|
for (SocketList::iterator s = _listensockets.Begin(); s != _listensockets.End(); s++) {
|
||||||
_listensocket = INVALID_SOCKET;
|
closesocket(s->second);
|
||||||
|
}
|
||||||
|
_listensockets.Clear();
|
||||||
DEBUG(net, 1, "Closed listener");
|
DEBUG(net, 1, "Closed listener");
|
||||||
}
|
}
|
||||||
NetworkUDPCloseAll();
|
NetworkUDPCloseAll();
|
||||||
|
@ -820,7 +818,9 @@ static bool NetworkReceive()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* take care of listener port */
|
/* take care of listener port */
|
||||||
if (_network_server) FD_SET(_listensocket, &read_fd);
|
for (SocketList::iterator s = _listensockets.Begin(); s != _listensockets.End(); s++) {
|
||||||
|
FD_SET(s->second, &read_fd);
|
||||||
|
}
|
||||||
|
|
||||||
tv.tv_sec = tv.tv_usec = 0; // don't block at all.
|
tv.tv_sec = tv.tv_usec = 0; // don't block at all.
|
||||||
#if !defined(__MORPHOS__) && !defined(__AMIGA__)
|
#if !defined(__MORPHOS__) && !defined(__AMIGA__)
|
||||||
|
@ -831,7 +831,9 @@ static bool NetworkReceive()
|
||||||
if (n == -1 && !_network_server) NetworkError(STR_NETWORK_ERR_LOSTCONNECTION);
|
if (n == -1 && !_network_server) NetworkError(STR_NETWORK_ERR_LOSTCONNECTION);
|
||||||
|
|
||||||
/* accept clients.. */
|
/* accept clients.. */
|
||||||
if (_network_server && FD_ISSET(_listensocket, &read_fd)) NetworkAcceptClients();
|
for (SocketList::iterator s = _listensockets.Begin(); s != _listensockets.End(); s++) {
|
||||||
|
if (FD_ISSET(s->second, &read_fd)) NetworkAcceptClients(s->second);
|
||||||
|
}
|
||||||
|
|
||||||
/* read stuff from clients */
|
/* read stuff from clients */
|
||||||
FOR_ALL_CLIENT_SOCKETS(cs) {
|
FOR_ALL_CLIENT_SOCKETS(cs) {
|
||||||
|
@ -1059,11 +1061,6 @@ void NetworkStartUp()
|
||||||
_network_need_advertise = true;
|
_network_need_advertise = true;
|
||||||
_network_advertise_retries = 0;
|
_network_advertise_retries = 0;
|
||||||
|
|
||||||
/* Set an ip when the hostname is empty */
|
|
||||||
if (StrEmpty(_settings_client.network.server_bind_ip)) {
|
|
||||||
snprintf(_settings_client.network.server_bind_ip, sizeof(_settings_client.network.server_bind_ip), "%s", NetworkAddress().GetHostname());
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Generate an unique id when there is none yet */
|
/* Generate an unique id when there is none yet */
|
||||||
if (StrEmpty(_settings_client.network.network_id)) NetworkGenerateUniqueId();
|
if (StrEmpty(_settings_client.network.network_id)) NetworkGenerateUniqueId();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue