苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 7446|回复: 2

[其他] 为什么我调用Socket.Dispose()函数后程序会进入BeginAccept的回调函数里?

[复制链接]
发表于 2013-10-4 09:27:11 | 显示全部楼层 |阅读模式
本帖最后由 头文字C 于 2013-10-5 22:31 编辑

为什么我调用Socket.Dispose()函数后程序会进入BeginAccept的回调函数里?
我的程序如下希望各位能帮我看下。感激不禁!
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Data;
  8. using System.Windows.Documents;
  9. using System.Windows.Input;
  10. using System.Windows.Media;
  11. using System.Windows.Media.Imaging;
  12. using System.Windows.Navigation;
  13. using System.Windows.Shapes;

  14. using System.Net;
  15. using System.Net.Sockets;
  16. using System.Threading;
  17. //using System.Windows.Forms;

  18. namespace TCP
  19. {
  20.     delegate void dgSetText(string str);//第一步:委托声明
  21.     delegate int dgGetPort();//第一步:委托声明
  22.    
  23.     /// <summary>
  24.     /// MainWindow.xaml 的交互逻辑
  25.     /// </summary>
  26.     public partial class MainWindow : Window
  27.     {
  28.         static bool bConnecting = true;
  29.         static bool bDisconnect = false;
  30.         Thread gMyThread;
  31.         private static bool vIsConnect = bDisconnect;
  32.         static Socket gNewSocket;
  33.         static Socket gClient;
  34.         static byte[] gReBuf  = new byte[1024];

  35.         public MainWindow()
  36.         {
  37.             InitializeComponent();
  38.         }

  39.         private void Window_Loaded(object sender, RoutedEventArgs e)
  40.         {

  41.             IPHostEntry Here = Dns.GetHostEntry(Dns.GetHostName());//Dns.GetHostName()获取本地主机名
  42.             IPAddress LocalAddress = Here.AddressList[3];//需要完善
  43.             tbServerAdd.Text = LocalAddress.ToString();
  44.             
  45.            
  46.         }

  47.         //服务器侦听等待线程
  48.         private void thfAcceptConnection()
  49.         {
  50.             //try
  51.             {
  52.                 int Port;   
  53.                 dgGetPort gt = new dgGetPort(dgfGetPort);//第二步:实例化委托
  54.                 Port = (int)this.Dispatcher.Invoke(gt);
  55.                 IPHostEntry here = Dns.GetHostEntry(Dns.GetHostName());//Dns.GetHostName()获取本地主机名
  56.                 IPAddress localaddress = here.AddressList[3];//
  57.                 IPEndPoint iep = new IPEndPoint(localaddress, Port);
  58.                 gNewSocket = new Socket(AddressFamily.InterNetwork,
  59.                                         SocketType.Stream,
  60.                                         ProtocolType.Tcp);
  61.                 gNewSocket.Bind(iep);
  62.                 gNewSocket.Listen(20);
  63.                 while (vIsConnect == bDisconnect)
  64.                 {

  65.                     gNewSocket.BeginAccept(new AsyncCallback(cbfAccpet), gNewSocket);
  66.                     Thread.Sleep(1);

  67.                 }
  68.             }
  69.             //catch (Exception thfA_error)
  70.             //{
  71.             //    MessageBox.Show(thfA_error.Message.ToString(), "thfA_exception");
  72.             //}
  73.         }

  74.         //服务器接受Accept回调函数
  75.         private void cbfAccpet(IAsyncResult iar)//调用gNewSocket.Dispose();后进入这里
  76.         {
  77.             
  78.             if (vIsConnect == bDisconnect)
  79.             {
  80.                 //try
  81.                 {
  82.                     Socket oldserver = (Socket)iar.AsyncState;
  83.                     gClient = oldserver.EndAccept(iar);
  84.                     gClient.BeginReceive(gReBuf ,0,gReBuf .Length,
  85.                                     SocketFlags.None, new AsyncCallback(cbfRead), gClient);//*******
  86.                     if (gClient.Connected == true)
  87.                     {
  88.                         vIsConnect = bConnecting;
  89.                     }
  90.                 }
  91.                 //catch (Exception cbfA_error)
  92.                 //{
  93.                 //    MessageBox.Show(cbfA_error.Message.ToString(), "cbfA_exception");
  94.                 //}
  95.             }
  96.         }
  97.         //异步接收数据回调函数
  98.         private void cbfRead(IAsyncResult iar)
  99.         {
  100.             try
  101.             {
  102.                 if (vIsConnect == bConnecting)//
  103.                 {
  104.                     Socket so = (Socket)iar.AsyncState;
  105.                     int recv = so.EndReceive(iar);
  106.                     string str = Encoding.ASCII.GetString(gReBuf  , 0, recv);
  107.                     IPEndPoint client = (IPEndPoint)so.RemoteEndPoint;
  108.                     dgSetText ST = new dgSetText(dgfShowText);//第二步:实例化委托
  109.                     string dgfShowTextshow = client.Address.ToString() + "\t" + str + "。";
  110.                     //this.Dispatcher.Invoke(ST, client.Address.ToString());
  111.                     this.Dispatcher.Invoke(ST,dgfShowTextshow);
  112.                     //显示完成后继续执行read回调函数接受数据
  113.                     so.BeginReceive(gReBuf  , 0, gReBuf  .Length,
  114.                     SocketFlags.None, new AsyncCallback(cbfRead), so);
  115.                 }

  116.             }
  117.             catch (Exception cbfR_error)
  118.             {
  119.                 MessageBox.Show(cbfR_error.Message.ToString(), "cbfR_exception");
  120.             }
  121.         }
  122.         //异步发送回调函数
  123.         private void cbfSend(IAsyncResult iar)
  124.         {

  125.             try
  126.             {
  127.                 gClient.EndSend(iar);  
  128.             }
  129.             catch (Exception cbfs_error)
  130.             {
  131.                 MessageBox.Show(cbfs_error.Message.ToString(), "cbfs_exception");
  132.             }
  133.         }

  134.         private void dgfShowText(string str)//第0步:定义方法
  135.         {
  136.             receiveBox1.AppendText(str + "\r");//显示文本内容
  137.             receiveBox1.ScrollToEnd();//将控件的内容滚动到当前插入符号位置。
  138.         }
  139.         private int dgfGetPort()//第0步:定义方法
  140.         {
  141.             int Port;
  142.             Port = Convert.ToInt32(PortNum.Text);
  143.             return Port;   
  144.         }

  145.         //侦听按钮回调函数
  146.         private void btListen_Click(object sender, RoutedEventArgs e)
  147.         {
  148.             btListen.IsEnabled = false;
  149.             btListen.Foreground = Brushes.Gray;//按钮点击后失能并变灰
  150.             gMyThread=new Thread(new ThreadStart(thfAcceptConnection));
  151.             gMyThread.Start();

  152.         }

  153.         private void btClose_Click(object sender, RoutedEventArgs e)
  154.         {
  155.             //try
  156.             {
  157.                 vIsConnect = bDisconnect;//
  158.                 btListen.IsEnabled = true;
  159.                 btListen.Foreground = Brushes.Black;

  160.                 gClient.Shutdown(SocketShutdown.Both);//禁用某Socket上的发送和接收。
  161.                 gClient.Close();
  162.                 gNewSocket.Dispose();//调用后进入cbfAccept
  163.                 gMyThread.Abort();
  164.                
  165.             }
  166.             //catch (Exception btC_error)
  167.             //{
  168.             //    MessageBox.Show(btC_error.Message.ToString(), "btC_exception");
  169.             //}
  170.             
  171.         }


  172.         private void btSend_Click(object sender, RoutedEventArgs e)
  173.         {
  174.             
  175.             //try
  176.             {
  177.                 byte[] sdata = Encoding.ASCII.GetBytes(tbSendStr.Text + "\r");
  178.                 gClient.BeginSend(sdata, 0, sdata.Length, SocketFlags.None,
  179.                                         new AsyncCallback(cbfSend), gClient);
  180.             }
  181.             //catch (Exception bts_error)
  182.             //{
  183.             //    MessageBox.Show(bts_error.Message.ToString(), "bts_exception");
  184.             //}
  185.         }

  186.         private void Window_Closed(object sender, EventArgs e)
  187.         {
  188.             gClient.Shutdown(SocketShutdown.Both);//禁用某Socket上的发送和接收。
  189.             gClient.Close();
  190.             gNewSocket.Dispose();
  191.             gMyThread.Abort();
  192.             
  193.         }   
  194.     }
  195. }
复制代码


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-10-6 13:30:01 | 显示全部楼层
刚开始了解异步 不懂,帮顶
另外,你这个单纯在cbfRead里面加try catch靠谱么,有的异常应该捕获不到吧,最后 异常之后如何统计在线用户数呢或者说怎么统计在线用户,
 楼主| 发表于 2013-10-6 15:00:35 | 显示全部楼层
lyg1112 发表于 2013-10-6 13:30
刚开始了解异步 不懂,帮顶
另外,你这个单纯在cbfRead里面加try catch靠谱么,有的异常应该捕获不到吧, ...

谢谢你帮我顶!
我现在只是想实现一下基本的功能,没有你想的那么多!我现在只考虑有1个用户的情况。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-28 13:13

© 2014-2021

快速回复 返回顶部 返回列表