Skip to content

Commit

Permalink
修正Listen端口0时,某些情况无法将实际端口正确写回Port属性的BUG
Browse files Browse the repository at this point in the history
  • Loading branch information
winddriver committed May 25, 2017
1 parent a5950fd commit 50f4ec9
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 7 deletions.
16 changes: 13 additions & 3 deletions Net/Net.CrossHttpParams.pas
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,11 @@ TFormField = class
/// </param>
function AsString(AEncoding: TEncoding = nil): string;

/// <summary>
/// 释放流数据
/// </summary>
procedure FreeValue;

/// <summary>
/// 名称
/// </summary>
Expand Down Expand Up @@ -766,7 +771,7 @@ TSessions = class(TSessionsBase)
implementation

uses
Utils.Utils;
Utils.Utils, Utils.DateTime;

{ TNameValue }

Expand Down Expand Up @@ -1208,15 +1213,20 @@ constructor TFormField.Create;

destructor TFormField.Destroy;
begin
if Assigned(FValue) then
FreeAndNil(FValue);
FreeValue;

if FAutoDeleteFile and (FFilePath <> '') and TFile.Exists(FFilePath) then
TFile.Delete(FFilePath);

inherited;
end;

procedure TFormField.FreeValue;
begin
if Assigned(FValue) then
FreeAndNil(FValue);
end;

function TFormField.AsBytes: TBytes;
var
LBytesStream: TBytesStream;
Expand Down
15 changes: 13 additions & 2 deletions Net/Net.CrossServer.pas
Original file line number Diff line number Diff line change
Expand Up @@ -106,15 +106,26 @@ procedure TCrossServer.Stop;

procedure TCrossServer.TriggerListened(ASocket: THandle);
var
LPort: Word;
LAddr: TRawSockAddrIn;
LStuff: string;
begin
inherited;

LPort := AtomicCmpExchange(FPort, 0, 0);

// 如果是监听的随机端口
// 则在监听成功之后将实际的端口取出来
if (FPort = 0) and (TSocketAPI.GetSockName(ASocket, @LAddr.Addr, LAddr.AddrLen) = 0) then
TSocketAPI.ExtractAddrInfo(@LAddr.Addr, LAddr.AddrLen, LStuff, FPort);
if (LPort = 0) then
begin
FillChar(LAddr, SizeOf(TRawSockAddrIn), 0);
LAddr.AddrLen := SizeOf(LAddr.Addr6);
if (TSocketAPI.GetSockName(ASocket, @LAddr.Addr, LAddr.AddrLen) = 0) then
begin
TSocketAPI.ExtractAddrInfo(@LAddr.Addr, LAddr.AddrLen, LStuff, LPort);
AtomicExchange(FPort, LPort);
end;
end;
end;

end.
9 changes: 8 additions & 1 deletion Net/Net.CrossSocket.pas
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,12 @@ TCrossSocket = class(TCustomCrossSocket)
/// <item>
/// '::', 监听所有IPv6地址
/// </item>
/// <item>
/// '127.0.0.1', 监听本地IPv4回环地址
/// </item>
/// <item>
/// '::1', 监听本地IPv6回环地址
/// </item>
/// </list>
/// </param>
/// <param name="APort">
Expand All @@ -420,7 +426,7 @@ TCrossSocket = class(TCustomCrossSocket)
/// 非0, 调用失败
/// </item>
/// </list>
/// 当OnListened触发时才表明监听成功 <br />
/// 当OnListened触发时才表明监听成功
/// </returns>
function Listen(const AHost: string; APort: Word;
const ACallback: TProc<THandle, Boolean> = nil): Integer; override;
Expand Down Expand Up @@ -835,6 +841,7 @@ procedure TCustomCrossSocket.TriggerConnected(ASocket: THandle;
(LConnection as TCrossConnection).FOwner := Self;
(LConnection as TCrossConnection).FSocket := ASocket;
(LConnection as TCrossConnection).FConnectType := AConnectType;
FillChar(LAddr, SizeOf(TRawSockAddrIn), 0);
LAddr.AddrLen := SizeOf(LAddr.Addr6);
if (TSocketAPI.GetPeerName(ASocket, @LAddr.Addr, LAddr.AddrLen) = 0) then
TSocketAPI.ExtractAddrInfo(@LAddr.Addr, LAddr.AddrLen,
Expand Down
2 changes: 1 addition & 1 deletion Net/Net.CrossSslServer.pas
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ procedure TCrossSslServer.Start(const ACallback: TProc<Boolean>);
StartLoop;

Listen(FAddr, FPort,
procedure(ASuccess: Boolean)
procedure(ASocket: THandle; ASuccess: Boolean)
begin
if not ASuccess then
AtomicExchange(FStarted, 0);
Expand Down

0 comments on commit 50f4ec9

Please sign in to comment.