我正在做一个简单的项目,涉及到一个服务器程序和一个客户端程序。需要检查客户端是否连接(从服务器端),反之亦然。
当客户端失去互联网连接时,服务器需要知道它已经断开连接。然后,当客户端恢复互联网连接时,需要重新连接到服务器。
当客户端失去互联网连接并恢复互联网连接时,我无法使用相同的端口重新连接。
我尝试保持服务器监听并不关闭套接字,但也没有起作用。我已经尝试了许多有关套接字重用的属性,并且还尝试了残留的东西。
我发现它可能会被操作系统在注册表中设置的一些TIME_WAIT
属性所卡住(在Windows的情况下)。我的问题是,能否在客户端失去和恢复互联网连接后仍然使用相同的套接字(更重要的是相同的端口)进行重新连接并继续监听等待重新连接。
就像我说的,我可以在服务器端和客户端检测到它何时断开连接,但是当我尝试使用相同的端口和相同的套接字或重新启动的套接字重新连接时,它仍然无法连接并且根本不会显示。有什么建议可以帮助解决这个问题吗?我已经搜索了很长时间来解决这个问题。
场景:
- 服务器正在监听
- 客户端连接到服务器
- 拔掉客户端的互联网连接
- 将客户端互联网电缆重新插入
- 客户端自动重新连接到服务器(当前无法在同一端口上执行此操作)
TL;DR:在客户端-服务器模型中失去和恢复互联网,但无法使用相同的套接字和端口连接到服务器。
代码:
private void button2_Click(object sender, EventArgs e)
{
// This will stop the threads/connections and toggle the button back to its original state
if (button2.Text == "Stop Listening")
{
listener.Close();
stop = true;
threadsActive = false;
button2.Text = "Start Listening";
textBox1.AppendText("Manually Closed Threads/Connections" + Environment.NewLine);
}
else
{
listenThread = new Thread(listenLoop);
listenThread.IsBackground = true;
status = new Thread(checkIfOnline);
status.IsBackground = true;
stop = false;
threadsActive = true;
button2.Text = "Stop Listening";
localEndPoint = new IPEndPoint(IPAddress.Parse("129.59.79.65"), 3000);
listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listenThread.Start();
status.Start();
}
}
====================================================
private void listenLoop()
{
try
{
listener.Bind(localEndPoint);
listener.Listen(100);
textBox1.AppendText("Waiting for a client..." + Environment.NewLine);
listener = listener.Accept();
textBox1.AppendText("Client Connected!!" + Environment.NewLine);
status.Start();
while (!close)
{
if (stop)
return;
// server connection loop
}
if(close)
return;
}
catch (Exception excp)
{
}
}
====================================================
private void ResetSocket()
{
// stop all threads and connections
stop = true;
listener.Close();
textBox1.AppendText("Attempting to kill threads..." + Environment.NewLine);
//while (listenThread.IsAlive == true || status.IsAlive == true) { /*loop until the threads are killed*/ textBox1.AppendText("Closing Threads..."); }
//listener.Close();
threadsActive = false;
textBox1.AppendText("All Threads/Connections Closed" + Environment.NewLine + "Restarting Threads/Connections..." + Environment.NewLine);
// re-establish and start threads and connections again
stop = false;
listenThread = new Thread(listenLoop);
listenThread.IsBackground = true;
status = new Thread(checkIfOnline);
status.IsBackground = true;
threadsActive = true;
localEndPoint = new IPEndPoint(IPAddress.Parse("129.59.79.65"), 3000);
listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listenThread.Start();
status.Start();
textBox1.AppendText("Threads/Connections Restarted Successfully" + Environment.NewLine);
}