diff --git a/src/game/g_net.pas b/src/game/g_net.pas
index 6d6be993ebc751a06046fae9e04a6bbffe618207..c5bce9648aa54223153106e3caf337bd21707018 100644 (file)
--- a/src/game/g_net.pas
+++ b/src/game/g_net.pas
e_log, e_msg, ENet, Classes, MAPDEF{$IFDEF USE_MINIUPNPC}, miniupnpc;{$ELSE};{$ENDIF}
const
e_log, e_msg, ENet, Classes, MAPDEF{$IFDEF USE_MINIUPNPC}, miniupnpc;{$ELSE};{$ENDIF}
const
- NET_PROTOCOL_VER = 173;
+ NET_PROTOCOL_VER = 178;
NET_MAXCLIENTS = 24;
NET_CHANS = 11;
NET_MAXCLIENTS = 24;
NET_CHANS = 11;
NET_CLIENT = 2;
NET_BUFSIZE = $FFFF;
NET_CLIENT = 2;
NET_BUFSIZE = $FFFF;
+ NET_PING_PORT = $DF2D;
NET_EVERYONE = -1;
NET_EVERYONE = -1;
BANLIST_FILENAME = 'banlist.txt';
NETDUMP_FILENAME = 'netdump';
BANLIST_FILENAME = 'banlist.txt';
NETDUMP_FILENAME = 'netdump';
+ {$IFDEF FREEBSD}
+ NilThreadId = nil;
+ {$ELSE}
+ NilThreadId = 0;
+ {$ENDIF}
+
type
TNetClient = record
ID: Byte;
type
TNetClient = record
ID: Byte;
NetIGDService: TURLStr;
{$ENDIF}
NetIGDService: TURLStr;
{$ENDIF}
+ NetPortThread: TThreadID = NilThreadId;
+
NetDumpFile: TStream;
function g_Net_Init(): Boolean;
NetDumpFile: TStream;
function g_Net_Init(): Boolean;
function g_Net_Client_ByPlayer(PID: Word): pTNetClient;
function g_Net_ClientName_ByID(ID: Integer): string;
function g_Net_Client_ByPlayer(PID: Word): pTNetClient;
function g_Net_ClientName_ByID(ID: Integer): string;
-procedure g_Net_SendData(Data:AByte; peer: pENetPeer; Reliable: Boolean; Chan: Byte = NET_CHAN_DOWNLOAD);
+procedure g_Net_SendData(Data: AByte; peer: pENetPeer; Reliable: Boolean; Chan: Byte = NET_CHAN_DOWNLOAD);
function g_Net_Wait_Event(msgId: Word): TMemoryStream;
function IpToStr(IP: LongWord): string;
function g_Net_Wait_Event(msgId: Word): TMemoryStream;
function IpToStr(IP: LongWord): string;
NetMode := NET_NONE;
NetMode := NET_NONE;
+ if NetPortThread <> NilThreadId then
+ WaitForThreadTerminate(NetPortThread, 66666);
+
+ NetPortThread := NilThreadId;
g_Net_UnforwardPorts();
if NetDump then
g_Net_UnforwardPorts();
if NetDump then
{ /// SERVER FUNCTIONS /// }
{ /// SERVER FUNCTIONS /// }
+function ForwardThread(Param: Pointer): PtrInt;
+begin
+ Result := 0;
+ if not g_Net_ForwardPorts() then Result := -1;
+end;
+
function g_Net_Host(IPAddr: LongWord; Port: enet_uint16; MaxClients: Cardinal = 16): Boolean;
begin
if NetMode <> NET_NONE then
function g_Net_Host(IPAddr: LongWord; Port: enet_uint16; MaxClients: Cardinal = 16): Boolean;
begin
if NetMode <> NET_NONE then
NetAddr.host := IPAddr;
NetAddr.port := Port;
NetAddr.host := IPAddr;
NetAddr.port := Port;
- if NetForwardPorts then g_Net_ForwardPorts();
+ if NetForwardPorts then NetPortThread := BeginThread(ForwardThread);
NetHost := enet_host_create(@NetAddr, NET_MAXCLIENTS, NET_CHANS, 0, 0);
NetHost := enet_host_create(@NetAddr, NET_MAXCLIENTS, NET_CHANS, 0, 0);
if NetPongSock <> ENET_SOCKET_NULL then
begin
NetPongAddr.host := IPAddr;
if NetPongSock <> ENET_SOCKET_NULL then
begin
NetPongAddr.host := IPAddr;
- NetPongAddr.port := Port + 1;
+ NetPongAddr.port := NET_PING_PORT;
if enet_socket_bind(NetPongSock, @NetPongAddr) < 0 then
begin
enet_socket_destroy(NetPongSock);
if enet_socket_bind(NetPongSock, @NetPongAddr) < 0 then
begin
enet_socket_destroy(NetPongSock);
NetOut.Clear();
NetOut.Write(Byte(Ord('D')));
NetOut.Write(Byte(Ord('F')));
NetOut.Clear();
NetOut.Write(Byte(Ord('D')));
NetOut.Write(Byte(Ord('F')));
+ NetOut.Write(NetPort);
NetOut.Write(ClTime);
g_Net_Slist_WriteInfo();
NPl := 0;
NetOut.Write(ClTime);
g_Net_Slist_WriteInfo();
NPl := 0;
Result := 0;
if NetUseMaster then
Result := 0;
if NetUseMaster then
- begin
g_Net_Slist_Check;
g_Net_Slist_Check;
- g_Net_Host_CheckPings;
- end;
+ g_Net_Host_CheckPings;
while (enet_host_service(NetHost, @NetEvent, 0) > 0) do
begin
while (enet_host_service(NetHost, @NetEvent, 0) > 0) do
begin
ProcessLoading(true);
ProcessLoading(true);
- if e_KeyPressed(IK_ESCAPE) or e_KeyPressed(IK_SPACE) then
+ if e_KeyPressed(IK_ESCAPE) or e_KeyPressed(IK_SPACE) or e_KeyPressed(VK_ESCAPE) then
OuterLoop := False;
end;
OuterLoop := False;
end;
end;
end;
end;
end;
-procedure g_Net_SendData(Data:AByte; peer: pENetPeer; Reliable: Boolean; Chan: Byte = NET_CHAN_DOWNLOAD);
+procedure g_Net_SendData(Data: AByte; peer: pENetPeer; Reliable: Boolean; Chan: Byte = NET_CHAN_DOWNLOAD);
var
P: pENetPacket;
F: enet_uint32;
var
P: pENetPacket;
F: enet_uint32;
ProcessLoading(true);
ProcessLoading(true);
- if e_KeyPressed(IK_ESCAPE) or e_KeyPressed(IK_SPACE) then
+ if e_KeyPressed(IK_ESCAPE) or e_KeyPressed(IK_SPACE) or e_KeyPressed(VK_ESCAPE) then
break;
end;
Result := msgStream;
break;
end;
Result := msgStream;
Urls: TUPNPUrls;
Data: TIGDDatas;
LanAddr: array [0..255] of Char;
Urls: TUPNPUrls;
Data: TIGDDatas;
LanAddr: array [0..255] of Char;
- ExtAddr: array [0..40] of Char;
StrPort: AnsiString;
Err, I: Integer;
begin
StrPort: AnsiString;
Err, I: Integer;
begin
exit;
end;
exit;
end;
- conwriteln('trying to forward server ports...');
-
NetPongForwarded := False;
NetPortForwarded := 0;
NetPongForwarded := False;
NetPortForwarded := 0;
- DevList := upnpDiscover(1000, nil, nil, 0, 0, Addr(Err));
+ DevList := upnpDiscover(1000, nil, nil, 0, 0, 2, Addr(Err));
if DevList = nil then
begin
if DevList = nil then
begin
- conwritefln(' upnpDiscover() failed: %d', [Err]);
+ conwritefln('port forwarding failed: upnpDiscover() failed: %d', [Err]);
exit;
end;
exit;
end;
if I = 0 then
begin
if I = 0 then
begin
- conwriteln(' could not find an IGD device on this LAN, aborting');
+ conwriteln('port forwarding failed: could not find an IGD device on this LAN');
FreeUPNPDevList(DevList);
FreeUPNPUrls(@Urls);
exit;
FreeUPNPDevList(DevList);
FreeUPNPUrls(@Urls);
exit;
- end
- else if I = 1 then
- conwritefln(' found IGD @ %s', [Urls.controlURL])
- else
- conwritefln(' found some kind of UPNP device @ %s, maybe it''ll work', [Urls.controlURL]);
-
- UPNP_GetExternalIPAddress(Urls.controlURL, Addr(data.first.servicetype[1]), Addr(ExtAddr[0]));
- if ExtAddr[0] <> #0 then
- conwritefln(' external IP address: %s', [Addr(ExtAddr[0])]);
+ end;
StrPort := IntToStr(NetPort);
I := UPNP_AddPortMapping(
StrPort := IntToStr(NetPort);
I := UPNP_AddPortMapping(
if I <> 0 then
begin
if I <> 0 then
begin
- conwritefln(' forwarding port %d failed: error %d', [NetPort, I]);
+ conwritefln('forwarding port %d failed: error %d', [NetPort, I]);
FreeUPNPDevList(DevList);
FreeUPNPUrls(@Urls);
exit;
FreeUPNPDevList(DevList);
FreeUPNPUrls(@Urls);
exit;
if ForwardPongPort then
begin
if ForwardPongPort then
begin
- StrPort := IntToStr(NetPort + 1);
+ StrPort := IntToStr(NET_PING_PORT);
I := UPNP_AddPortMapping(
Urls.controlURL, Addr(data.first.servicetype[1]),
PChar(StrPort), PChar(StrPort), Addr(LanAddr[0]), PChar('D2DF'),
I := UPNP_AddPortMapping(
Urls.controlURL, Addr(data.first.servicetype[1]),
PChar(StrPort), PChar(StrPort), Addr(LanAddr[0]), PChar('D2DF'),
if I <> 0 then
begin
if I <> 0 then
begin
- conwritefln(' forwarding port %d failed: error %d', [NetPort + 1, I]);
+ conwritefln('forwarding port %d failed: error %d', [NetPort + 1, I]);
NetPongForwarded := False;
end
else
begin
NetPongForwarded := False;
end
else
begin
- conwritefln(' forwarded port %d successfully', [NetPort + 1]);
+ conwritefln('forwarded port %d successfully', [NetPort + 1]);
NetPongForwarded := True;
end;
end;
NetPongForwarded := True;
end;
end;
- conwritefln(' forwarded port %d successfully', [NetPort]);
+ conwritefln('forwarded port %d successfully', [NetPort]);
NetIGDControl := AnsiString(Urls.controlURL);
NetIGDService := data.first.servicetype;
NetPortForwarded := NetPort;
NetIGDControl := AnsiString(Urls.controlURL);
NetIGDService := data.first.servicetype;
NetPortForwarded := NetPort;