我目前正在使用UDP协议在C#中创建远程管理工具。
因为UDP是无连接的,我让客户端每秒发送一个Keep-Alive数据包,而在服务器端,每次客户端连接时,都会为新客户端创建一个新的计时器,间隔为2秒(如果在没有从客户端收到数据包的情况下经过2秒,则客户端超时并被视为断开连接)。
现在,问题是,当我连接多个用户时,只有当第一个用户断开连接时,服务器会检测到这一点。当其他用户继续超时并断开连接时,服务器不会注意到,似乎客户端仍然连接。
对于客户端对象 - 每个客户端都有一个timer参数,每次创建Client对象时都会使用构造函数自动创建。
userID变量是Form中的一个类变量,应该计算总连接用户的数量。
这是服务器端代码:
void Receive()
{
while (true)
{
bool pass = true;
byte[] msg = new byte[1024];
IPEndPoint Sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)Sender;
try { server.ReceiveFrom(msg, ref Remote); }
catch { pass = false; }
if (pass)
{
Thread handle = new Thread(() => HandleInput(msg, Remote));
handle.Start();
}
}
}
void HandleInput(byte[] msg, EndPoint Remote)
{
string data = Encoding.ASCII.GetString(msg);
data = data.Replace("\0", "");
if (data.Contains("Connect!"))
{
clients.Add(new Client(Remote, userID));
clients[userID].timer.Elapsed += (sender, e) => Timeout(sender, e, clients[userID-1]);
clients[userID].timer.Enabled = true;
listBox1.Items.Add(Remote.ToString());
userID++;
}
for (int i = 0; i < clients.Count; i++)
{
if (EndPoint.Equals(clients[i].Remote, Remote))
{
clients[i].timer.Interval = 2000;
}
}
}
void Timeout(object source, ElapsedEventArgs e, Client user)
{
listBox1.Items.Remove(user.Remote.ToString());
label2.Text = user.Remote.ToString() + " Disconnected";
}
客户端代码并不重要 - Keep-Alive每秒只发送一个数据包。
那么,为什么服务器只检测到第一次断开连接?
我尝试用计时器改变一些东西,但没有运气。
你们有什么想法吗?
答案 0 :(得分:1)
如果userId始终相同怎么办?