C# 断开插座时,会出现等待时间
最近我在用C#学习网络和Windows窗体 我正在尝试构建一个异步套接字网络系统,一切正常 连接和连接回调的代码如下所示C# 断开插座时,会出现等待时间,c#,sockets,visual-studio-2013,asyncsocket,C#,Sockets,Visual Studio 2013,Asyncsocket,最近我在用C#学习网络和Windows窗体 我正在尝试构建一个异步套接字网络系统,一切正常 连接和连接回调的代码如下所示 private void ClientConnect() { CheckForIllegalCrossThreadCalls = false; try { socket.BeginConnect(endPoint, new AsyncCallback(ConnectCallback), soc
private void ClientConnect()
{
CheckForIllegalCrossThreadCalls = false;
try
{
socket.BeginConnect(endPoint, new AsyncCallback(ConnectCallback), socket);
connectDone.WaitOne();
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void ConnectCallback(IAsyncResult ar)
{
try
{
Socket client = (Socket)ar.AsyncState;
client.EndConnect(ar);
Send(socket, textBox3.Text, 0);
connectDone.Set();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void btnDisconnect_Click(object sender, EventArgs e)
{
try
{
socket.Shutdown(SocketShutdown.Both);
Application.DoEvents();
socket.Disconnect(true); //-> problem occurs.
}
catch
{
MessageBox.Show("Disconnect Error!");
}
if (socket.Connected)
MessageBox.Show("Disconnect Error!");
else
textBox1.AppendText("Disconnected! (" + DateTime.Now.ToString("h:mm:ss tt") + ")\n");
}
但在断开插座时,出现了一个问题
我制作了一个按钮来断开插座,下面是按钮点击事件的代码
private void ClientConnect()
{
CheckForIllegalCrossThreadCalls = false;
try
{
socket.BeginConnect(endPoint, new AsyncCallback(ConnectCallback), socket);
connectDone.WaitOne();
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void ConnectCallback(IAsyncResult ar)
{
try
{
Socket client = (Socket)ar.AsyncState;
client.EndConnect(ar);
Send(socket, textBox3.Text, 0);
connectDone.Set();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void btnDisconnect_Click(object sender, EventArgs e)
{
try
{
socket.Shutdown(SocketShutdown.Both);
Application.DoEvents();
socket.Disconnect(true); //-> problem occurs.
}
catch
{
MessageBox.Show("Disconnect Error!");
}
if (socket.Connected)
MessageBox.Show("Disconnect Error!");
else
textBox1.AppendText("Disconnected! (" + DateTime.Now.ToString("h:mm:ss tt") + ")\n");
}
当我断开插座时,会有2分钟的等待时间
2分钟后(我用时间戳检查),它显示“断开连接”消息
我可以重新连接这个插座
我认为这不仅仅是像睡觉一样等待,有些事情是在后台处理的
(因为鼠标光标已更改,程序被阻止)
我很想知道为什么会发生这种延迟
请让我知道。如果您想学习如何正确操作,请删除
CheckForIllegalCrossThreadCalls=false
和Application.DoEvents()代码>。这些都是解决方法。你需要阅读有关套接字编程的知识。正确的“优雅关闭”包括仅使用shutdown(send)来启动断开连接,然后等待接收操作以0字节计数完成。然后,断开连接将立即发生(假设远程端点写入正确)。按照您的操作方式,套接字会陷入等待状态,以确保防止数据丢失/损坏。正确断开连接后,不可能出现此类错误,并且可以立即关闭。@Peter Duniho您的意思是我必须将关机(两者)更改为关机(发送)?但我想增加接收消息的功能。和。。我放弃了一些同步(waitone/set),但仍在等待。有没有可能服务器程序对此有问题?“我必须将Shutdown(两者)更改为Shutdown(发送)?”--是的,这就是我的意思。但单凭这一点并不能解决你的问题。您仍然需要正确地处理远程端点,同时关闭套接字(通过看到接收操作完成且字节计数为0来检测)_“有没有可能服务器程序对此有问题?”--对不起,不清楚您所说的“这”是什么意思。但是假设服务器写得正确,那么当客户端代码也写得正确时,它就可以正常工作了。没问题。如果您想学习如何正确操作,请删除CheckForIllegalCrossThreadCalls=false
和Application.DoEvents()代码>。这些都是解决方法。你需要阅读有关套接字编程的知识。正确的“优雅关闭”包括仅使用shutdown(send)来启动断开连接,然后等待接收操作以0字节计数完成。然后,断开连接将立即发生(假设远程端点写入正确)。按照您的操作方式,套接字会陷入等待状态,以确保防止数据丢失/损坏。正确断开连接后,不可能出现此类错误,并且可以立即关闭。@Peter Duniho您的意思是我必须将关机(两者)更改为关机(发送)?但我想增加接收消息的功能。和。。我放弃了一些同步(waitone/set),但仍在等待。有没有可能服务器程序对此有问题?“我必须将Shutdown(两者)更改为Shutdown(发送)?”--是的,这就是我的意思。但单凭这一点并不能解决你的问题。您仍然需要正确地处理远程端点,同时关闭套接字(通过看到接收操作完成且字节计数为0来检测)_“有没有可能服务器程序对此有问题?”--对不起,不清楚您所说的“这”是什么意思。但是假设服务器写得正确,那么当客户端代码也写得正确时,它就可以正常工作了。没问题。