Skip to content

Commit

Permalink
全体で一つだけ持っていたグローバルIPアドレスを削除してリスナー毎に保持するように徹底した。
Browse files Browse the repository at this point in the history
グローバルIPアドレスがリスナー毎に保持しているものと全体で一つだけ持っていたものが混在しており、正しいグローバルIPアドレスが使えていなかったので
リスナー毎のIPアドレスを使うように統一した。
  • Loading branch information
kumaryu committed Feb 4, 2022
1 parent 43bb41d commit 81097c9
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 85 deletions.
12 changes: 12 additions & 0 deletions PeerCastStation/PeerCastStation.Core/OutputListener.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,18 @@ public IPAddress GlobalAddress {
}
}
}

public IPEndPoint GlobalEndPoint {
get {
if (globalAddress==null) {
return null;
}
else {
return new IPEndPoint(globalAddress, ((IPEndPoint)server.LocalEndpoint).Port);
}
}
}

private bool bound = false;
private PortStatus portStatus = PortStatus.Unknown;
public PortStatus Status {
Expand Down
31 changes: 1 addition & 30 deletions PeerCastStation/PeerCastStation.Core/PeerCast.cs
Original file line number Diff line number Diff line change
Expand Up @@ -468,35 +468,6 @@ public IPAddress GetLocalAddress(AddressFamily family)
}
}

private IPAddress globalAddressV4 = null;
private IPAddress globalAddressV6 = null;

public IPAddress GetGlobalAddress(AddressFamily family)
{
switch (family) {
case AddressFamily.InterNetwork:
return globalAddressV4;
case AddressFamily.InterNetworkV6:
return globalAddressV6;
default:
throw new NotSupportedException();
}
}

public void SetGlobalAddress(IPAddress addr)
{
switch (addr.AddressFamily) {
case AddressFamily.InterNetwork:
globalAddressV4 = addr;
break;
case AddressFamily.InterNetworkV6:
globalAddressV6 = addr;
break;
default:
throw new NotSupportedException();
}
}

/// <summary>
/// 指定したエンドポイントで接続待ち受けを開始します
/// </summary>
Expand Down Expand Up @@ -539,7 +510,7 @@ public IPEndPoint GetGlobalEndPoint(AddressFamily addr_family, OutputStreamType
var listener = outputListeners.FirstOrDefault(
x => x.LocalEndPoint.AddressFamily==addr_family &&
(x.GlobalOutputAccepts & connection_type)!=0);
var addr = GetGlobalAddress(addr_family);
var addr = listener.GlobalAddress;
if (listener!=null && addr!=null) {
return new IPEndPoint(addr, listener.LocalEndPoint.Port);
}
Expand Down
49 changes: 18 additions & 31 deletions PeerCastStation/PeerCastStation.PCP/PCPSourceStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ public class PCPSourceConnection
private IContentSink contentSink;
private Content lastHeader = null;
private ChannelInfo lastInfo = null;
private OutputListener listener = null;

public PCPSourceConnection(
PeerCast peercast,
Expand All @@ -123,6 +124,9 @@ public PCPSourceConnection(
protected override void OnStarted()
{
Logger.Debug("Started");
listener = PeerCast.FindListener(
connection.RemoteEndPoint.Address,
OutputStreamType.Relay | OutputStreamType.Metadata);
lastInfo = Channel.ChannelInfo;
lastHeader = Channel.ContentHeader;
Channel.AddMonitor(this);
Expand Down Expand Up @@ -305,26 +309,14 @@ private Atom CreatePCPHelo()
var helo = new AtomCollection();
helo.SetHeloAgent(PeerCast.AgentName);
helo.SetHeloSessionID(PeerCast.SessionID);
switch (PeerCast.GetPortStatus(Channel.NetworkAddressFamily)) {
switch (listener?.Status ?? PortStatus.Firewalled) {
case PortStatus.Open:
{
var listener = PeerCast.FindListener(
connection.RemoteEndPoint.Address,
OutputStreamType.Relay | OutputStreamType.Metadata);
helo.SetHeloPort(listener.LocalEndPoint.Port);
}
helo.SetHeloPort(listener.LocalEndPoint.Port);
break;
case PortStatus.Firewalled:
break;
case PortStatus.Unknown:
{
var listener = PeerCast.FindListener(
connection.RemoteEndPoint.Address,
OutputStreamType.Relay | OutputStreamType.Metadata);
if (listener!=null) {
helo.SetHeloPing(listener.LocalEndPoint.Port);
}
}
helo.SetHeloPing(listener.LocalEndPoint.Port);
break;
}
PCPVersion.SetHeloVersion(helo);
Expand Down Expand Up @@ -427,18 +419,12 @@ private Atom CreatePCPHOST()
var host = new AtomCollection();
host.SetHostChannelID(Channel.ChannelID);
host.SetHostSessionID(PeerCast.SessionID);
var globalendpoint =
PeerCast.GetGlobalEndPoint(
connection.RemoteEndPoint.AddressFamily,
OutputStreamType.Relay);
var globalendpoint = listener?.GlobalEndPoint;
if (globalendpoint!=null) {
host.AddHostIP(globalendpoint.Address);
host.AddHostPort(globalendpoint.Port);
}
var localendpoint =
PeerCast.GetLocalEndPoint(
connection.RemoteEndPoint.AddressFamily,
OutputStreamType.Relay);
var localendpoint = listener?.LocalEndPoint;
if (localendpoint!=null) {
host.AddHostIP(localendpoint.Address);
host.AddHostPort(localendpoint.Port);
Expand All @@ -454,7 +440,7 @@ private Atom CreatePCPHOST()
host.SetHostFlags1(
(Channel.IsRelayable(false) ? PCPHostFlags1.Relay : 0) |
(Channel.IsPlayable(false) ? PCPHostFlags1.Direct : 0) |
((PeerCast.GetPortStatus(connection.RemoteEndPoint.AddressFamily)!=PortStatus.Open) ? PCPHostFlags1.Firewalled : 0) |
(listener?.Status!=PortStatus.Open ? PCPHostFlags1.Firewalled : 0) |
(RecvRate>0 ? PCPHostFlags1.Receiving : 0));
host.SetHostUphostIP(connection.RemoteEndPoint.Address);
host.SetHostUphostPort(connection.RemoteEndPoint.Port);
Expand Down Expand Up @@ -539,16 +525,18 @@ protected bool ProcessAtom(Atom atom, ID4[] accepts)
protected void OnPCPOleh(Atom atom)
{
var rip = atom.Children.GetHeloRemoteIP();
if (rip!=null) {
var global_addr = PeerCast.GetGlobalAddress(rip.AddressFamily);
if (rip!=null && Channel.NetworkAddressFamily==rip.AddressFamily) {
var global_addr = listener?.GlobalAddress;
if (global_addr==null ||
global_addr.GetAddressLocality()<=rip.GetAddressLocality()) {
PeerCast.SetGlobalAddress(rip);
if (listener!=null) {
listener.GlobalAddress = rip;
}
}
}
var port = atom.Children.GetHeloPort();
if (port.HasValue) {
PeerCast.SetPortStatus(((IPEndPoint)connection.Client.Client.LocalEndPoint).Address, rip, port.Value!=0 ? PortStatus.Open : PortStatus.Firewalled);
if (port.HasValue && listener!=null) {
listener.Status = port.Value!=0 ? PortStatus.Open : PortStatus.Firewalled;
}
var sid = atom.Children.GetHeloSessionID();
if (sid.HasValue) {
Expand Down Expand Up @@ -889,8 +877,7 @@ private Uri CreateHostUri(Host host)
private bool IsSiteLocal(Host node)
{
if (node.GlobalEndPoint!=null) {
var global = PeerCast.GetGlobalAddress(node.GlobalEndPoint.AddressFamily);
return node.GlobalEndPoint.Equals(global);
return PeerCast.OutputListeners.Any(listener => node.GlobalEndPoint.Equals(listener.GlobalEndPoint));
}
else {
return true;
Expand Down
48 changes: 24 additions & 24 deletions PeerCastStation/PeerCastStation.PCP/PCPYellowPageClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ public QuitException(int code)
private class BannedException : Exception {}
private IPEndPoint remoteEndPoint;
private Guid? remoteSessionID;
private OutputListener listener;

private async Task PCPHandshake(ConnectionStream stream, CancellationToken ct)
{
Expand All @@ -246,30 +247,14 @@ private async Task PCPHandshake(ConnectionStream stream, CancellationToken ct)
helo.SetHeloVersion(PCPVersion.ServantVersion);
helo.SetHeloSessionID(peerCast.SessionID);
helo.SetHeloBCID(peerCast.BroadcastID);
switch (peerCast.GetPortStatus(networkType)) {
switch (listener?.Status ?? PortStatus.Firewalled) {
case PortStatus.Open:
{
var listener = peerCast.FindListener(
networkType.GetAddressFamily(),
stream.RemoteEndPoint.Address,
OutputStreamType.Relay | OutputStreamType.Metadata);
if (listener!=null) {
helo.SetHeloPort(listener.LocalEndPoint.Port);
}
}
helo.SetHeloPort(listener.LocalEndPoint.Port);
break;
case PortStatus.Firewalled:
break;
case PortStatus.Unknown:
{
var listener = peerCast.FindListener(
networkType.GetAddressFamily(),
stream.RemoteEndPoint.Address,
OutputStreamType.Relay | OutputStreamType.Metadata);
if (listener!=null) {
helo.SetHeloPing(listener.LocalEndPoint.Port);
}
}
helo.SetHeloPing(listener.LocalEndPoint.Port);
break;
}
await stream.WriteAsync(new Atom(Atom.PCP_HELO, helo), ct).ConfigureAwait(false);
Expand All @@ -294,16 +279,18 @@ private void OnPCPOleh(ConnectionStream stream, Atom atom)
throw new BannedException();
}
var rip = atom.Children.GetHeloRemoteIP();
if (rip!=null) {
var global_addr = peerCast.GetGlobalAddress(rip.AddressFamily);
if (rip!=null && listener?.LocalEndPoint?.AddressFamily==rip.AddressFamily) {
var global_addr = listener?.GlobalAddress;
if (global_addr==null ||
global_addr.GetAddressLocality()<=rip.GetAddressLocality()) {
peerCast.SetGlobalAddress(rip);
if (listener!=null) {
listener.GlobalAddress = rip;
}
}
}
var port = atom.Children.GetHeloPort();
if (port.HasValue) {
peerCast.SetPortStatus(stream.LocalEndPoint.Address, rip, port.Value!=0 ? PortStatus.Open : PortStatus.Firewalled);
if (port.HasValue && listener!=null) {
listener.Status = port.Value!=0 ? PortStatus.Open : PortStatus.Firewalled;
}
}

Expand Down Expand Up @@ -440,6 +427,7 @@ void handleException(Exception ex) {
using (var client=new TcpClient()) {
await client.ConnectAsync(host, port).ConfigureAwait(false);
using (var stream=new ConnectionStream(client.Client, client.GetStream())) {
OnStarted(stream);
await PCPHandshake(stream, ct).ConfigureAwait(false);
logger.Debug("Handshake succeeded");
status = ConnectionStatus.Connected;
Expand All @@ -455,6 +443,7 @@ await TaskWhenAllForAwait(
}
logger.Debug("Closing connection");
await stream.WriteAsync(new Atom(Atom.PCP_QUIT, Atom.PCP_ERROR_QUIT)).ConfigureAwait(false);
OnStopped(stream);
result = ConnectionResult.Stopped;
status = ConnectionStatus.Idle;
}
Expand All @@ -474,6 +463,17 @@ await TaskWhenAllForAwait(
return result;
}

private void OnStarted(ConnectionStream connection)
{
listener = peerCast.FindListener(
connection.RemoteEndPoint.Address,
OutputStreamType.Relay | OutputStreamType.Metadata);
}

private void OnStopped(ConnectionStream connection)
{
}

private void CheckConnection() {
async Task startConnection(Task prevTask) {
await prevTask.ConfigureAwait(false);
Expand Down

0 comments on commit 81097c9

Please sign in to comment.