private void OnReceiveCallBack(IAsyncResult asyncResult)
{
var udpClient = (UdpClient) asyncResult.AsyncState;
var endPoint = new IPEndPoint(IPAddress.Any, 0);
try
{
var receiveBytes = udpClient.EndReceive(asyncResult, ref endPoint);
var receiveString = Encoding.ASCII.GetString(receiveBytes);
var exp = new Regex("BT-SEARCH \\* HTTP/1.1\\r\\nHost: 239.192.152.143:6771\\r\\nPort: (?<port>[^@]+)\\r\\nInfohash: (?<hash>[^@]+)\\r\\n\\r\\n\\r\\n");
var match = exp.Match(receiveString);
if (!match.Success)
return;
var portcheck = Convert.ToInt32(match.Groups["port"].Value);
if (portcheck < 0 || portcheck > 65535)
return;
TorrentManager manager = null;
var matchHash = InfoHash.FromHex(match.Groups["hash"].Value);
for (var i = 0; manager == null && i < _engine.Torrents.Count; i++)
if (_engine.Torrents[i].InfoHash == matchHash)
manager = _engine.Torrents[i];
if (manager == null)
return;
var uri = new Uri(string.Format("tcp://{0}{1}{2}", endPoint.Address, ':', match.Groups["port"].Value));
var peer = new Peer("", uri, EncryptionTypes.All);
// Add new peer to matched Torrent
if (!manager.HasMetadata || !manager.Torrent.IsPrivate)
{
ClientEngine.MainLoop.Queue(() =>
{
var count = manager.AddPeersCore(peer);
manager.RaisePeersFound(new LocalPeersAdded(manager, count, 1));
});
}
}
catch
{
// Failed to receive data, ignore
}
finally
{
try
{
udpClient.BeginReceive(OnReceiveCallBack, asyncResult.AsyncState);
}
catch
{
// It's closed
}
}
}