public PeerInfo Wave(IPEndPoint facilitatorIp, int timeout, UdpClient udpClient)
{
long waitTime = timeout * 10000;
_udpClient = udpClient;
Logger.Debug("Waving at " + facilitatorIp + " from local port " + ((IPEndPoint)udpClient.Client.LocalEndPoint).Port + " for " + timeout + "ms");
var packet = new StandardWaveTunnelRqPacket { internalEndPoint = new IPEndPoint(IPAddress.Any, ((IPEndPoint)udpClient.Client.LocalEndPoint).Port) };
long startTime = DateTime.Now.Ticks;
_waveEvent.Reset();
// Setup a listener for a wave response
InitReceiverWaveRs();
do
{
byte[] sendBytes = packet.getBytes();
udpClient.Send(sendBytes, sendBytes.Length, facilitatorIp);
if (DateTime.Now.Ticks - startTime > waitTime)
{
Logger.Error("Wave timeout : " + (DateTime.Now.Ticks - startTime));
//throw new TimeoutException("Timeout occured while waving");
break;
}
Logger.Debug("Waiting for wave response from " + facilitatorIp + " to local port " + ((IPEndPoint)udpClient.Client.LocalEndPoint).Port);
} while (!_waveEvent.WaitOne(2000));
if(_waveResult == null)
{
_waveResult = new PeerInfo();
}
_waveResult.InternalEndPoints = GetLocalEndPoints(_udpClient);
return _waveResult;
}