protected internal virtual void doConnect(int port)
{
try
{
socket = new System.Net.Sockets.TcpClient();
socket.NoDelay = true;
var connected = false;
Thread thr = new Thread(
() => {
try
{
socket.Connect(peer.host(), port);
connected = true;
}
catch (System.Exception)
{
}
}
) { IsBackground = true, Name = "OtpSockConnectThread" };
thr.Start();
Debug.WriteLine("-> MD5 CONNECT TO " + peer.host() + ": " + port);
var untilTime = DateTime.Now.AddMilliseconds(_connectTimeout);
while (!connected && DateTime.Now < untilTime)
Thread.Sleep(10);
if (!connected) // Timeout
{
throw new OtpTimeoutException("Timeout waiting for connect to " + peer.host() + ':' + port);
}
if (traceLevel >= OtpTrace.Type.handshakeThreshold)
OtpTrace.TraceEvent("-> MD5 CONNECT TO " + peer.host() + ":" + port);
sendName(peer.distChoose, self.flags);
recvStatus();
int her_challenge = recvChallenge();
byte[] our_digest = genDigest(her_challenge, auth_cookie);
int our_challenge = genChallenge();
sendChallengeReply(our_challenge, our_digest);
recvChallengeAck(our_challenge);
cookieOk = true;
sendCookie = false;
}
catch (OtpAuthException ae)
{
close();
throw ae;
}
catch (System.Net.Sockets.SocketException e)
{
close();
throw new System.IO.IOException("Cannot connect to peer node: " + e.ToString());
}
}