SOCKET 断开连接问题

six-years 2014-04-30 09:25:28
这几天发现一个奇怪的问题 socket关闭后还是能在360网络连接里面看到连接未断开 不知道各位是怎么彻底删除连接的
...全文
261 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lulu23260 2014-05-01
  • 打赏
  • 举报
回复
我断开之后,可能要重用套接字,所以是disconnect,从没close过,
six-years 2014-04-30
  • 打赏
  • 举报
回复
引用 12 楼 lulu23260 的回复:
哦,我自己用的可能比较低端吧,就要断开的时候,判断一下是否连接,是连接状态就disConnect,挺好使的,可能我的使用比较简单, 断开-连接-断开-连接……挺灵的
引用 14 楼 Q1092926267 的回复:
[quote=引用 12 楼 lulu23260 的回复:] 哦,我自己用的可能比较低端吧,就要断开的时候,判断一下是否连接,是连接状态就disConnect,挺好使的,可能我的使用比较简单, 断开-连接-断开-连接……挺灵的
你是怎么判断它已经断开连接的 在360中显示么?还是[/quote] 刚写了一个简单的测试程序 服务器端

 private void button1_Click(object sender, EventArgs e)
        {

            new Thread((ThreadStart)delegate {recive(); }).Start();
        }
        void recive()
        {

            //接收信息
            IPAddress ips = Dns.GetHostAddresses(Dns.GetHostName())[0];
            IPEndPoint ip = new IPEndPoint(IPAddress.Any, 5050);
            Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            soc.Bind(ip);
            soc.Listen(10);
            Socket hander = soc.Accept();
            hander.ReceiveTimeout = 2000;
            try
            {
                while (true)
                {
                    byte[] bytes = new byte[1024];
                    int len = hander.Receive(bytes);
                    hander.Send(new byte[] { 0x3A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B });
                    Thread.Sleep(1000);
                }
            }
            catch 
            {
                hander.Close();
                hander.Dispose();
            }
        }


客户端


private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            td = new Thread(new ThreadStart(send));
            td.IsBackground = true;
            td.Start();

        }
        byte[] bt = new byte[1024];
        Socket senSock = null;
        void send()
        {

                senSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                
                    try
                    {
                        IPEndPoint sendEndPoint = new IPEndPoint(IPAddress.Parse("192.168.2.128"), 5050);
                        senSock.SendTimeout = 2000;
                        senSock.Connect(sendEndPoint);
                        senSock.Send(new byte[] { 0x3A, 0x03, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B });
                        while (true)
                        {

                            int len = senSock.Receive(bt);
                            senSock.Send(new byte[] { 0x3A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B });
                            Thread.Sleep(1000);
                        }
                    }
                    catch
                    {
                        senSock.Close();
                    }
                
  }

six-years 2014-04-30
  • 打赏
  • 举报
回复
引用 12 楼 lulu23260 的回复:
哦,我自己用的可能比较低端吧,就要断开的时候,判断一下是否连接,是连接状态就disConnect,挺好使的,可能我的使用比较简单, 断开-连接-断开-连接……挺灵的
你是怎么判断它已经断开连接的 在360中显示么?还是
xdashewan 2014-04-30
  • 打赏
  • 举报
回复
没有发现断不开的情况,楼主还是自行检查代码是否有问题,另外可以看下微软对close方法的推荐执行顺序 http://technet.microsoft.com/zh-cn/library/wahsac9k(v=vs.100).aspx
lulu23260 2014-04-30
  • 打赏
  • 举报
回复
哦,我自己用的可能比较低端吧,就要断开的时候,判断一下是否连接,是连接状态就disConnect,挺好使的,可能我的使用比较简单, 断开-连接-断开-连接……挺灵的
six-years 2014-04-30
  • 打赏
  • 举报
回复
不会这个问题还没有人发现吧 其实也是很难发现 我以前也没注意过 现在因为对设备通信 设备用wifi肯定会断开连接断开连接 后来我就发现断开次数太多了 设备就连不上了 在360中强行关闭端口 再打开就又能连接了 当然也可能是设备连接的问题 不过关闭连接还是很有必要的 毕竟志愿还是占用 长时间开启程序那岂不是资源都消耗光了
xdashewan 2014-04-30
  • 打赏
  • 举报
回复
是否真断开你要程序再联结来说明事实,不能光靠其他软件的监控
six-years 2014-04-30
  • 打赏
  • 举报
回复
引用 8 楼 lulu23260 的回复:
再重新连,能连上就证明已经断开了吧,菜鸟猜的,,我觉得360的判断也不一定那么靠谱
如果不能完全释放的话 下次连接有可能就连接不上 尤其是对设备通信
lulu23260 2014-04-30
  • 打赏
  • 举报
回复
再重新连,能连上就证明已经断开了吧,菜鸟猜的,,我觉得360的判断也不一定那么靠谱
six-years 2014-04-30
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
是客户端断不开,还是服务端断不开?
服务器端断开连接 从360上看还是会显示连接
引用 6 楼 jiangfling 的回复:
360 刷新了没?
刷新了
PaulyJiang 2014-04-30
  • 打赏
  • 举报
回复
360 刷新了没?
於黾 2014-04-30
  • 打赏
  • 举报
回复
是客户端断不开,还是服务端断不开?
six-years 2014-04-30
  • 打赏
  • 举报
回复
引用 3 楼 Humourer 的回复:
[quote=引用 2 楼 Q1092926267 的回复:] } catch (Exception ex) { hander.Close(); hander.Dispose(); } catch就不用说了吧 客户端在我设置的时间内没有返回肯定会抛异常
不是吧! 断不开?[/quote] 我也是最近发现这问题 socket以前做的还是比较多 也没发现
X_SpringSun 2014-04-30
  • 打赏
  • 举报
回复
引用 2 楼 Q1092926267 的回复:
} catch (Exception ex) { hander.Close(); hander.Dispose(); } catch就不用说了吧 客户端在我设置的时间内没有返回肯定会抛异常
不是吧! 断不开?
six-years 2014-04-30
  • 打赏
  • 举报
回复
} catch (Exception ex) { hander.Close(); hander.Dispose(); } catch就不用说了吧 客户端在我设置的时间内没有返回肯定会抛异常
xdashewan 2014-04-30
  • 打赏
  • 举报
回复
你总的先说下你是怎么关的吧
xdashewan 2014-04-30
  • 打赏
  • 举报
回复
引用 16 楼 Q1092926267 的回复:
终于测试出来了 是因为服务器端断开连接后 客户端依然是连接状态 才会出现这情况
大多这类问题都是由于自己粗心造成的
six-years 2014-04-30
  • 打赏
  • 举报
回复
终于测试出来了 是因为服务器端断开连接后 客户端依然是连接状态 才会出现这情况

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧