断开连接后,C#套接字连接会继续发送数据

时间:2015-04-21 12:11:36

标签: c# sockets

我有一个“开始”和“停止”按钮。单击开始按钮时,将创建一个新套接字并建立连接。单击停止按钮时,插座将关闭,断开,关闭并放置以确保其完全消失 至少,这就是我的想法:当停止连接后点击启动时,会创建一个新的套接字等但是一旦我发送数据,数据就会被发送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服务器都会退出它的listen-for-data循环并返回它等待连接状态(对于多个启动/停止连接)。

发送数据的代码:

// 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);

任何人都可以指出我做错了为什么套接字连接以某种方式继续生存和发送数据,即使我断开连接并关闭它们?

2 个答案:

答案 0 :(得分:1)

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

  

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

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

答案 1 :(得分:0)

由于您正在使用流套接字,如何为您的套接字声明网络流如下:

NetworkStream stream = new NetworkStream(soc);

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

stream.Flush();

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

soc.NoDelay = true;