+ if (!network.enabled)
+ return;
+
+ /* set message length header */
+ putNetwork32BitInteger(nb->buffer, nb->size - 4);
+
+ /* directly send the buffer to the network server */
+ SDLNet_TCP_Send(sfd, nb->buffer, nb->size);
+}
+
+static struct NetworkClientPlayerInfo *getNetworkPlayer(int player_nr)
+{
+ struct NetworkClientPlayerInfo *player = NULL;
+
+ for (player = &first_player; player; player = player->next)
+ if (player->nr == player_nr)
+ break;
+
+ if (player == NULL) /* should not happen */
+ Error(ERR_EXIT, "protocol error: reference to non-existing player %d",
+ player_nr);
+
+ return player;
+}
+
+char *getNetworkPlayerName(int player_nr)
+{
+ struct NetworkClientPlayerInfo *player;
+
+ if (player_nr == 0)
+ return("the network game server");
+ else if (player_nr == first_player.nr)
+ return("you");
+ else
+ for (player = &first_player; player; player = player->next)
+ if (player->nr == player_nr && strlen(player->name) > 0)
+ return(player->name);
+
+ return(EMPTY_PLAYER_NAME);
+}
+
+static boolean hasPathSeparator(char *s)
+{
+ return (strchr(s, '/') != NULL);
+}
+
+static void StartNetworkServer(int port)
+{
+ static int p;
+
+ p = port;
+#if defined(TARGET_SDL2)
+ server_thread = SDL_CreateThread(NetworkServerThread,
+ "NetworkServerThread", &p);
+#else
+ server_thread = SDL_CreateThread(NetworkServerThread, &p);
+#endif
+ network_server = TRUE;
+}
+
+boolean ConnectToServer(char *hostname, int port)
+{
+ IPaddress ip;
+ int server_host = 0;
+ int i;
+
+ if (read_buffer == NULL)
+ read_buffer = newNetworkBuffer();
+
+ if (write_buffer == NULL)
+ write_buffer = newNetworkBuffer();
+
+ DrawNetworkText_Title("Initializing Network");
+
+ if (port == 0)
+ port = DEFAULT_SERVER_PORT;
+
+ if (hostname == NULL)
+ {
+ // if no hostname given, try to auto-detect network server in local network
+ // by doing a UDP broadcast on the network server port and wait for answer
+
+ SDLNet_SocketSet udp_socket_set = SDLNet_AllocSocketSet(1);
+ if (!udp_socket_set)
+ Error(ERR_EXIT, "SDLNet_AllocSocketSet() failed: %s"), SDLNet_GetError();
+
+ udp = SDLNet_UDP_Open(0);
+ if(!udp)
+ Error(ERR_EXIT, "SDLNet_UDP_Open() failed: %s", SDLNet_GetError());
+
+ if (SDLNet_UDP_AddSocket(udp_socket_set, udp) == -1)
+ Error(ERR_EXIT_NETWORK_SERVER, "SDLNet_TCP_AddSocket() failed: %s"),
+ SDLNet_GetError();
+
+ char *data_ptr = "network server UDB broadcast";
+ int data_len = strlen(data_ptr) + 1;
+ IPaddress ip_address;
+
+ SDLNet_Write32(0xffffffff, &ip_address.host); /* 255.255.255.255 */
+ SDLNet_Write16(port, &ip_address.port);
+
+ UDPpacket packet =
+ {
+ -1,
+ (Uint8 *)data_ptr,
+ data_len,
+ data_len,
+ 0,
+ ip_address
+ };
+
+ SDLNet_UDP_Send(udp, -1, &packet);
+
+ DrawNetworkText("Looking for local network server ...");
+
+ /* wait for any local network server to answer UDP broadcast */
+ for (i = 0; i < 5; i++)
+ {
+ if (SDLNet_CheckSockets(udp_socket_set, 0) == 1)
+ {
+ int num_packets = SDLNet_UDP_Recv(udp, &packet);
+
+ if (num_packets == 1)
+ {
+ DrawNetworkText_Success("Network server found!");
+
+ server_host = SDLNet_Read32(&packet.address.host);
+ }
+ else
+ {
+ DrawNetworkText_Failed("No answer from network server!");
+ }
+
+ break;
+ }
+ else
+ {
+ Delay_WithScreenUpdates(100);
+ }
+ }
+
+ if (server_host == 0)
+ DrawNetworkText_Failed("No network server found!");
+ }
+
+ rfds = SDLNet_AllocSocketSet(1);
+
+ if (hostname)
+ {
+ SDLNet_ResolveHost(&ip, hostname, port);
+
+ if (ip.host == INADDR_NONE)
+ Error(ERR_EXIT, "cannot locate host '%s'", hostname);
+ else
+ server_host = SDLNet_Read32(&ip.host);
+
+ DrawNetworkText("Connecting to remote host ...");
+ }
+ else
+ {
+ // if no hostname was given and no network server was auto-detected in the
+ // local network, try to connect to a network server at the local host
+ if (server_host == 0)
+ server_host = 0x7f000001; /* 127.0.0.1 */
+
+ SDLNet_Write32(server_host, &ip.host);
+ SDLNet_Write16(port, &ip.port);
+
+ DrawNetworkText("Connecting to local host ...");
+ }
+
+ Error(ERR_DEBUG, "trying to connect to network server at %d.%d.%d.%d ...",
+ (server_host >> 24) & 0xff,
+ (server_host >> 16) & 0xff,
+ (server_host >> 8) & 0xff,
+ (server_host >> 0) & 0xff);
+
+ sfd = SDLNet_TCP_Open(&ip);
+
+ if (sfd)
+ {
+ SDLNet_TCP_AddSocket(rfds, sfd);
+
+ DrawNetworkText_Success("Successfully connected!");
+
+ return TRUE;
+ }
+ else