gpt4 book ai didi

c# - 关闭 TCP 套接字 - 调试器关闭连接时有何不同

转载 作者:太空宇宙 更新时间:2023-11-03 15:54:21 24 4
gpt4 key购买 nike

我创建一个到 PLC 的套接字连接:

IPEndPoint endPoint = new IPEndPoint(plcAddress, PORT);
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
m_socket.Connect(endPoint);

m_stream = new NetworkStream(m_socket);
m_writer = new StreamWriter(m_stream);
m_reader = new StreamReader(m_stream);

当我关闭我的程序或用户点击注销时,我调用这段代码:

if (m_reader != null) m_reader.Close();
if (m_writer != null) m_writer.Close();
if (m_stream != null) m_stream.Close();
if (m_socket != null)
{
m_socket.Shutdown(SocketShutdown.Both);
m_socket.Disconnect(false);
m_socket.Close();
m_socket.Dispose();
m_socket = null;
}

但是PLC并没有意识到连接已经关闭。我无法更改 PLC 上的任何代码。

但是当我在连接处于事件状态时停止 VisualStudio 调试器 (Shift+F5) 时,它会正确关闭。 VisualStudio 有何不同之处?

编辑:

当我按 Shift+F5 停止程序时,wireshark 额外捕获了这两行

enter image description here

编辑 2:

我有一个读取数据的线程:

while (m_runListener)
{
int cnt = m_reader.Read(buffer, 0, 1024);
if (cnt > 0)
{
// handle data
}
}

当我关闭程序时,如果不调用 Thread.Abort(); 就无法停止线程如果我删除阻塞调用 m_reader.Read(buffer, 0, 1024); 只是为了测试,断开连接会起作用。

最佳答案

我最近遇到了一个非常相似的问题,我还发现通过 Visual Studio 进行调试也使问题消失了。我相信这是由于 Visual Studio 中的调试器执行任务需要额外的时间,再加上关闭代码中可能有明显停止代码执行的断点。

我相当讨厌的解决方法是在一些关闭代码之间放置 Thread.Sleep(xxxx) 调用。我在 ShutdownDisconnect 调用之后有一个,以允许这些进程完成。我尝试了不同的值,但我选择了 100 毫秒,因为这确保了问题不再发生。

显然,更好的方法是查看是否可以将这些调用放入异步方法中,并仅在第一个方法完成后调用下一个方法,但由于项目规模小且很少使用,我没有费心会得到。

但是,我可能完全错了,这不是您遇到的问题,它听起来与我几周前遇到的问题非常相似。

关于c# - 关闭 TCP 套接字 - 调试器关闭连接时有何不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24281037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com