http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 4819|回复: 7

[其他] C# socket异步通信

[复制链接]
发表于 2013-3-20 16:49:29 | 显示全部楼层 |阅读模式
我要关闭clientSocket时,关不了,下面是我的部分代码
frmServer.cs
  1. void OnReceive(IAsyncResult ar)
  2.         {
  3.             Socket client = (Socket)ar.AsyncState;
  4.             if (client.Connected)
  5.             {
  6.                 try
  7.                 {
  8.                     int length = client.EndReceive(ar);
  9.                     client.BeginReceive(revByte, 0, buffersize, SocketFlags.None, new AsyncCallback(OnReceive), client);
  10.                 }
  11.                 catch (Exception ex)
  12.                 {
  13.                     MessageBox.Show(ex.Message);
  14.                 }
  15.             }
  16.             else
  17.             {
  18.                 ThreadMethodTxtServer(client.RemoteEndPoint.ToString() + " has disconnected!");
  19.             }
  20.         }
复制代码
frmClient.cs
  1. private void btnDisConnect_Click(object sender, EventArgs e)
  2.         {
  3.             if (clientSocket.Connected)
  4.             {
  5.                 clientSocket.Shutdown(SocketShutdown.Both);
  6.                 clientSocket.Close();
  7.             }
  8.             else
  9.             {
  10.                 MessageBox.Show(clientSocket.LocalEndPoint.ToString() + " has not connected!");
  11.             }
  12.         }
复制代码
调试了很多次都找不到原因,当关闭clientSocket时,serverSocket会执行OnReceive部分的代码,并且一直执行,而且client.Connected为true。


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-3-20 17:02:52 | 显示全部楼层
执行代码时有提示吗?或者直接试试Exit
 楼主| 发表于 2013-3-20 17:11:22 | 显示全部楼层
站长苏飞 发表于 2013-3-20 17:02
执行代码时有提示吗?或者直接试试Exit

没提示,就是一直循环的执行OnReceive()方法
发表于 2013-3-20 17:18:38 | 显示全部楼层
你的OnReceive应该是主线程里的吧,
如果你关了子Socket,会不会没有影响到主Socket,所以才执行,其它已经关闭了子Socket呢?
 楼主| 发表于 2013-3-21 09:32:44 | 显示全部楼层
站长苏飞 发表于 2013-3-20 17:18
你的OnReceive应该是主线程里的吧,
如果你关了子Socket,会不会没有影响到主Socket,所以才执行,其它已经 ...

都是子线程中的,关闭了clientSocket之后,不知道为什么没有影响到OnReceive中的。我在想,是不是因为是Tcp连接,当关闭客户端的socket时,会发送消息给TcpServerSocket,而在这时客户端的Socket已经关闭,所以serversocket就一直试图与客户端通信。我对Tcp通信不太熟,瞎猜的
发表于 2013-3-21 09:56:47 | 显示全部楼层
印醒 发表于 2013-3-21 09:32
都是子线程中的,关闭了clientSocket之后,不知道为什么没有影响到OnReceive中的。我在想,是不是因为是T ...

客户端关闭对服务端是没有影响的,所以你的方法会一直执行,一直监听的,或者你可以这样,当检查到没有影响或者没有数据时就表示断开或者是关闭
 楼主| 发表于 2013-3-27 15:39:50 | 显示全部楼层
此问题已经解决,就是捕获接收到的数据的长度,如果接收数据的长度为0,则说明对方发送的是端口关闭消息,我把它理解成是FIN帧
发表于 2013-3-27 15:49:17 | 显示全部楼层
印醒 发表于 2013-3-27 15:39
此问题已经解决,就是捕获接收到的数据的长度,如果接收数据的长度为0,则说明对方发送的是端口关闭消息,我 ...

恩好的,其实你自己也可以修改为已解决的,就在文章下面有个按钮,你的我修改过了就没有了,你可以参考下别的没有解决的问题
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-5-3 06:44

© 2014-2021

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