搜索
bottom↓
回复: 9

C#如何快速的查找可用的TCP服务器

[复制链接]

出590入992汤圆

发表于 2018-8-3 15:32:27 | 显示全部楼层 |阅读模式
当前电脑用作TCP客户端,TCP服务器与客户端都在一个子网内。TCP服务器不最多有64个,地址也就是:192.168.1.x,服务器端口号固定为5000,现在有什么方法可以判断当前子网有多少个这样的服务器。现在用的方法是:用try{}catch{}尝试连接,如果不出错,就认为存在,但是发现搜索一个子网速度比较慢,有没有快速的方法?

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入57汤圆

发表于 2018-8-3 15:36:35 | 显示全部楼层
udp广播一个包,然后服务器给你回一下。
后续再用tcp实现你的逻辑。

出590入992汤圆

 楼主| 发表于 2018-8-3 15:51:21 | 显示全部楼层
本帖最后由 SUPER_CRJ 于 2018-8-3 15:53 编辑
leafstamen 发表于 2018-8-3 15:36
udp广播一个包,然后服务器给你回一下。
后续再用tcp实现你的逻辑。


好方法,但是有没有不用UDP的?现在尝试连接等待出错连接不上要几秒的时间。
而且一个问题:UDP能给TCP服务器发消息?

出0入0汤圆

发表于 2018-8-3 16:10:50 | 显示全部楼层
TCP超时时间设置!
本class 来自网络,目前我正在使用!

使用方法  TimeOutSocket.Connect(IPPoint, SocketTimeout);

  1. class TimeOutTcpClient
  2.     {
  3.         private static bool IsConnectionSuccessful = false;
  4.         private static Exception socketexception;
  5.         private static ManualResetEvent TimeoutObject = new ManualResetEvent(false);

  6.         public static TcpClient Connect(IPEndPoint remoteEndPoint, int timeoutMSec)
  7.         {
  8.             TimeoutObject.Reset();
  9.             socketexception = null;

  10.             string serverip = Convert.ToString(remoteEndPoint.Address);
  11.             int serverport = remoteEndPoint.Port;
  12.             TcpClient tcpclient = new TcpClient();

  13.             tcpclient.BeginConnect(serverip, serverport,
  14.                 new AsyncCallback(CallBackMethod), tcpclient);

  15.             if (TimeoutObject.WaitOne(timeoutMSec, false))
  16.             {
  17.                 if (IsConnectionSuccessful)
  18.                 {
  19.                     return tcpclient;
  20.                 }
  21.                 else
  22.                 {
  23.                     throw socketexception;
  24.                 }
  25.             }
  26.             else
  27.             {
  28.                 tcpclient.Close();
  29.                 throw new TimeoutException("Connection TimeOut");
  30.             }
  31.         }
  32.         private static void CallBackMethod(IAsyncResult asyncresult)
  33.         {
  34.             try
  35.             {
  36.                 IsConnectionSuccessful = false;
  37.                 TcpClient tcpclient = asyncresult.AsyncState as TcpClient;

  38.                 if (tcpclient.Client != null)
  39.                 {
  40.                     tcpclient.EndConnect(asyncresult);
  41.                     IsConnectionSuccessful = true;
  42.                 }
  43.             }
  44.             catch (Exception ex)
  45.             {
  46.                 IsConnectionSuccessful = false;
  47.                 socketexception = ex;
  48.             }
  49.             finally
  50.             {
  51.                 TimeoutObject.Set();
  52.             }
  53.         }
  54.     }


  55.     class TimeOutSocket
  56.     {
  57.         private static bool IsConnectionSuccessful = false;
  58.         private static Exception socketexception;
  59.         private static System.Threading.ManualResetEvent TimeoutObject = new System.Threading.ManualResetEvent(false);

  60.         public static Socket Connect(IPEndPoint remoteEndPoint, int timeoutMSec)
  61.         {
  62.             TimeoutObject.Reset();
  63.             socketexception = null;

  64.             Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  65.             socketClient.BeginConnect(remoteEndPoint, new AsyncCallback(CallBackMethod), socketClient);

  66.             if (TimeoutObject.WaitOne(timeoutMSec, false))
  67.             {
  68.                 if (IsConnectionSuccessful)
  69.                     return socketClient;
  70.                 else
  71.                     throw socketexception;
  72.             }
  73.             else
  74.             {
  75.                 socketClient.Close();
  76.                 throw new TimeoutException("Connection TimeOut ");
  77.             }

  78.         }
  79.         private static void CallBackMethod(IAsyncResult asyncresult)
  80.         {
  81.             try
  82.             {
  83.                 IsConnectionSuccessful = false;
  84.                 Socket socketClient = asyncresult.AsyncState as Socket;

  85.                 if (socketClient != null)
  86.                 {
  87.                     socketClient.EndConnect(asyncresult);
  88.                     IsConnectionSuccessful = true;
  89.                 }
  90.             }
  91.             catch (Exception ex)
  92.             {
  93.                 IsConnectionSuccessful = false;
  94.                 socketexception = ex;
  95.             }
  96.             finally
  97.             {
  98.                 TimeoutObject.Set();
  99.             }
  100.         }
  101.     }
复制代码

出0入0汤圆

发表于 2018-8-3 16:21:48 | 显示全部楼层
本帖最后由 xivisi 于 2018-8-3 16:29 编辑

1、一次并发N个socket连接;
2、设定TCP连接超时短一点,反正局域网不影响

3、端口扫描工具了解一下,可以简单查看指定主机指定端口是否处于监听状态

出0入57汤圆

发表于 2018-8-3 16:25:00 | 显示全部楼层
SUPER_CRJ 发表于 2018-8-3 15:51
好方法,但是有没有不用UDP的?现在尝试连接等待出错连接不上要几秒的时间。
而且一个问题:UDP能给TCP服 ...

udp不能发给tcp,需要你的tcp服务器也坚定udp数据,相当于是udp握手,tcp业务。

出0入0汤圆

发表于 2018-8-3 16:29:29 | 显示全部楼层
网络中还有其他设备吗,如果没有采取ping的方式。

出0入442汤圆

发表于 2018-8-3 17:37:05 来自手机 | 显示全部楼层
xivisi 发表于 2018-8-3 16:21
1、一次并发N个socket连接;
2、设定TCP连接超时短一点,反正局域网不影响


只有2才是可行的。要我就直接开满一个子网同时查,哪个返回就用哪个。

出590入992汤圆

 楼主| 发表于 2018-8-6 09:15:45 | 显示全部楼层
longlong105 发表于 2018-8-3 16:10
TCP超时时间设置!
本class 来自网络,目前我正在使用!

已测试,非常好用,谢谢

出0入0汤圆

发表于 2018-8-6 18:10:33 来自手机 | 显示全部楼层
这种尝试的时间和资源开销大了点,其实,用组播方式来查询发布服务和申请,还可以有更多选择,比如均衡下多个服务器的负荷。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-16 22:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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