【问题标题】:C# socket connection keeps sending data after disconnect and closeC#套接字连接在断开和关闭后继续发送数据
【发布时间】:2015-04-21 12:11:36
【问题描述】:

我有一个“开始”和“停止”按钮。单击开始按钮时,会创建一个新套接字并建立连接。单击停止按钮时,套接字将关闭、断开连接、关闭并处理以确保它完全消失。
至少,这就是我的想法:在停止连接后单击开始时,会创建一个新的套接字等。但是一旦我发送数据,数据就会发送 x 次我创建套接字的次数(因此,x 的数量次我点击了开始按钮)。 这是开始的代码:

soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  // Socket soc; is declared at class-level
        System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse(IP);
        System.Net.IPEndPoint remoteEP = new IPEndPoint(ipAdd, port);

        try
        {
            soc.Connect(remoteEP);
            soc.Send(jsonSettings);
        }
        catch (SocketException e)
        {
            MessageBox.Show("Could not connect to socket");
        }

这是停止代码:

if (soc != null)
        {
            soc.Shutdown(SocketShutdown.Both);
            soc.Disconnect(false);
            soc.Close();
            soc.Dispose();
        }

这在VSTO PowerPoint add-in 应用程序中使用,如果这可能导致任何额外的特性,当建立连接时,我将字符串数据发送到侦听此端口的 Python 服务器。每次关闭连接时,Python 服务器都会退出它的监听数据循环并返回等待连接状态(对于多个启动/停止连接)。

发送数据代码:

// this is called each time the user goes to another slide in the PowerPoint presentation
byte[] byData = System.Text.Encoding.ASCII.GetBytes(stringValue); 
soc.Send(byData);

谁能指出我做错了什么,为什么即使我断开连接并关闭了套接字连接,它们仍然以某种方式继续存在和发送数据?

【问题讨论】:

    标签: c# sockets


    【解决方案1】:

    观察到的行为是完全关闭的重点和预期结果。来自Socket.Shutdown() 的 MSDN 页面:

    使用面向连接的 Socket 时,请始终在关闭 Socket 之前调用 Shutdown 方法。 这可确保在连接的套接字关闭之前发送和接收所有数据。

    Shutdown() 的调用会阻止您的应用程序将额外的传出数据排队,它不会阻止网络堆栈发送已缓冲的数据。

    【讨论】:

    • 那为什么socket在socket断开、关闭和处理之后仍然发送数据呢?那时它的缓冲区中没有更多数据,因此它不应该在套接字关闭和释放时发送任何内容,但是当我想在之后在一个全新的套接字上发送数据时,前一个套接字会发送数据也是。
    【解决方案2】:

    既然您使用的是流套接字,那么像这样为您的套接字声明网络流怎么样:

    NetworkStream stream = new NetworkStream(soc);
    

    然后在每次发送之后(以及在关闭套接字之前)刷新它:

    stream.Flush();
    

    还要确保在创建套接字时关闭 Nagle 算法 - 它会阻止在套接字上批量处理项目:

    soc.NoDelay = true;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      相关资源
      最近更新 更多