socket连接超时

问题描述

局域网客户端连接服务器,我想用for循环遍历连接服务器,例如服务器IP:192.168.1.10,如果从192.168.1.1开始连接,一直执行到正确的IP。但是一个错误的ip要花上20s,如此将会花大量的时间。如何缩短连接时间。以下代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Net.Sockets;usingSystem.Net;usingSystem.Threading;usingSystem.Collections;namespace客户端{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}voidShowMsg(stringstr){txtLog.AppendText(str+"rn");list.Add(str);}privatevoidForm1_Load(objectsender,EventArgse){Control.CheckForIllegalCrossThreadCalls=false;}SocketsocketSend;privatevoidbutton1_Click(objectsender,EventArgse){if(txtNum.Text.Length==12&&txtName.Text.Length>=2){try{MessageBox.Show("登录成功");socketSend=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);ThreadSocket();//Threadth=newThread(Socket);//th.IsBackground=true;//th.Start();}catch{}}elseif(txtNum.Text.Length!=12){MessageBox.Show("学号格式有误,请从新输入");txtNum.Clear();txtName.Clear();}else{MessageBox.Show("姓名格式有误,请从新输入");txtNum.Clear();txtName.Clear();}}voidThreadSocket(){stringhostname=Dns.GetHostName();//得到本机名IPHostEntrylocalhost=Dns.GetHostByName(hostname);//得到IPv4的地址IPAddresslocaladdr=localhost.AddressList[0];string[]ips=localaddr.ToString().Split('.');a=Convert.ToInt32(ips[0]);b=Convert.ToInt32(ips[1]);c=Convert.ToInt32(ips[2]);//Threadth=newThread(Socket);//th.IsBackground=false;//th.Start();Socket();}inta;intb;intc;intd=1;IPAddressip;booljudge=false;voidSocket(){try{while(judge==false){ip=IPAddress.Parse(a+"."+b+"."+c+"."+d);IPEndPointpoint=newIPEndPoint(ip,50000);socketSend.Connect(point);judge=true;}ShowMsg(txtNum.Text+txtName.Text+":连接成功");button1.Hide();button2.Visible=true;button3.Visible=true;button4.Visible=true;button5.Visible=true;btnBack.Visible=true;textBox1.Visible=true;txtNum.ReadOnly=true;txtName.ReadOnly=true;}catch{d++;Socket();}}voidShowMsg(stringstr1,stringstr2){txtNum.Text=str1;txtName.Text=str2;button1.Hide();}privatevoidbutton2_Click(objectsender,EventArgse){stringstr=textBox1.Text+"-"+txtName.Text+":正确";调用(str);}privatevoidbutton3_Click(objectsender,EventArgse){stringstr=textBox1.Text+"-"+txtName.Text+":放弃";调用(str);}privatevoidbutton4_Click(objectsender,EventArgse){stringstr=textBox1.Text+"-"+txtName.Text+":错误";调用(str);}intcount=1;void调用(stringstr){if(count<30){count++;textBox1.Text="第"+count+"题";txtLog.AppendText(str+"rn");list.Add(str);}else{txtLog.AppendText(str+"rn");list.Add(str);button2.Hide();button3.Hide();button4.Hide();}}ArrayListlist=newArrayList();intr;privatevoidbtnBack_Click(objectsender,EventArgse){if(count<=1){}elseif(count==30){button2.Visible=true;button3.Visible=true;button4.Visible=true;}else{count--;r=list.Count;list.RemoveAt(r-1);//删除最后一个元素txtLog.Clear();for(inti=0;i<list.Count;i++){txtLog.AppendText(list[i].ToString()+"rn");}}textBox1.Text="第"+count+"题";}privatevoidbutton5_Click(objectsender,EventArgse){list.RemoveAt(0);txtLog.Clear();for(inti=0;i<list.Count;i++){txtLog.AppendText(list[i]+"rn");}byte[]buffer=System.Text.Encoding.UTF8.GetBytes(txtLog.Text);socketSend.Send(buffer);button2.Hide();button3.Hide();button4.Hide();btnBack.Hide();button5.Hide();}}}

程序会卡在代码socketSend.Connect(point);

如何优化代码

解决方案

解决方案二:
遍历这个是没法优化了,但是socket链接返回结果,不可能会20s吧?不能修改返回结果的时间么?
解决方案三:
不要动不动就以“死循环”编程。如果块“死循环”这个想法,可能决策者会“玩死你”。只有那些会按照事件来安排程序代码的人才能精明地设计软件,而一些动不动就写“死循环”代码的人则是各种炮灰级的程序员。你若想成为一个有时间去研究能独当一面能力技术的程序员(而不是死抠一小段代码的“底层”程序员),就从删除你的Socket()方法中的循环语句开始。你的Socket()方法应该是几毫秒就结束了,不应该出现任何循环语句。这样,你就能了解另外一种编程设计思想。
解决方案四:
网络错误要十几秒、20秒才能捕捉到,这也是很正常的事情。编程设计本来就是一种智能活动。例如人家知道几十个任务并发执行,人家也知道“只选前3个最快返回的结果”来判断(而扔掉剩下几十个比较慢的任务)。这个如果没有在学校里学过基础知识(学校学的太少的话),在工作中也是必修的基础知识。如果你没有先发散后集中的编程设计思想,你就会纠结在一堆什么while循环的相互牵制、相互嵌套之中,只能做点简单的顺序操作,不知道如何进行真正发挥电脑、网络的特点的流程设计。整个计算机系统,在你那里只是一个大个的四则计算器,你只会顺序操作用一个手指头“点点点”,不知道如何设计并发的以及网络的软件。
解决方案五:
用Task执行该任务,可以设置超时退出。
解决方案六:
这种想法是不是有点反人类啊,如果IP最后一位是100呢?最好是固定IP,或者固定使用机器名.实在要如此可以开10个线程,取得最先返回结果的那个IP.
解决方案七:
引用5楼tcmakebest的回复:

这种想法是不是有点反人类啊,如果IP最后一位是100呢?最好是固定IP,或者固定使用机器名.实在要如此可以开10个线程,取得最先返回结果的那个IP.

有试过多线程,但是语句button2.Visible=true;button3.Visible=true;button4.Visible=true;button5.Visible=true;btnBack.Visible=true;textBox1.Visible=true;

执行过,但是却没有效果,有点莫名其妙,你看得出是哪里有问题吗
解决方案八:
引用4楼DOwnstairs的回复:

用Task执行该任务,可以设置超时退出。

有比较好的例子的链接吗
解决方案九:
引用7楼hu3625173的回复:

Quote: 引用4楼DOwnstairs的回复:
用Task执行该任务,可以设置超时退出。

有比较好的例子的链接吗

C#多线程编程中有好多可以设置超时退出的类。具体看你需要什么样的。https://msdn.microsoft.com/zh-cn/library/给你鱼竿

时间: 2024-08-31 01:48:45

socket连接超时的相关文章

Linux下Socket连接超时的一种实现方法

目前各平台通用的设置套接字(Socket)连接超时的办法是: 创建套接字,将其设置成非阻塞状态. 调用connect连接对端主机,如果失败,判断当时的errno是否为EINPROGRESS,也就是说是不是连接正在进行中,如果是,转到步骤3,如果不是,返回错误. 用select在指定的超时时间内监听套接字的写就绪事件,如果select有监听到,证明连接成功,否则连接失败. 以下是Linux环境下的示例代码: #include <stdlib.h> #include <stdio.h>

Socket连接超时(转)

Socket.connect连接超时有二种情况: 1.由于网络的问题,TCP/IP三次握手时间>timeout的设置时间.这在国外访问weibo时,并且网络环境极差的情况下有可能发生.解决的办法:调大socket.connect方法中的timeout参数值,比如50s,linux默认最高是70s,如果超过70s没有意义,linux会采用70s.但是当调大之后,发现不到10s就报timeout exception.通过国外的机器ping api.weibo.com发现unreachable.说明客

java-socket连接超时,时好时坏的

问题描述 socket连接超时,时好时坏的 给移动做了个app,用手机号码登录报socket连接超时,这应该是移动那边的问题吧? 解决方案 时好时坏应该是网络的原因,你ping下看看延迟 解决方案二: 把超时设置的时限调大一些看看

android-安卓socket设置超时时间不管用是为何?

问题描述 安卓socket设置超时时间不管用是为何? 解决方案 Socket 设置连接超时时间Socket 关于设置Socket连接超时时间Socket 关于设置Socket连接超时时间 解决方案二: synchronized void setSoTimeout(int timeout) Sets this socket's read timeout in milliseconds. 200是 0.2秒 这个方法是这是读取超时 解决方案三: timeout的时间单位是毫秒

socket 连接问题

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Diagnostics;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.ComponentModel;usingSystem.Windows.Forms;namespaceDadabaseToExcelTest

C# Socket连接请求超时机制实现代码分享

 这篇文章主要介绍了C# Socket连接请求超时机制实现,下面提供代码分享,大家可以参考使用 .Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Connect/BeginConnect提供超时控制机制.因此,当服务器未处于监听状态,或者发生网络故障时,客户端连接请求会被迫等待很长一段时间,直到抛出异常.默认的等待时间长达20~30s..Net Socket库的SocketOptionName.SendTimeout

PHP中Socket连接及读写数据超时问题分析_php技巧

本文实例讲述了PHP中Socket连接及读写数据超时问题.分享给大家供大家参考,具体如下: 虽然PHP中对fsockopen()方法有连接socket的超时参数,但是没有类似C中的连接成功后对数据的读写超时参数设置.没关系,PHP中对stream提供了一系列的方法以防止超时 stream_set_blocking( $fp , false ) 设置数据流为阻塞模式,以防止数据没读完就退出 如果模式为 false, 给定的 socket 描述符将切换到非块模式, 如果为 true, 则切换到块模式

Java中用Socket远程传输文件出现连接超时的异常

问题描述 这是服务端代码:publicclassFileServer{publicstaticvoidmain(String[]args)throwsException{Filefile=newFile("D:\a.txt");FileInputStreamfis=newFileInputStream(file);ServerSocketss=newServerSocket(8801);Socketclient=ss.accept();OutputStreamnetOut=client

连接超时-Connection timed out:

问题描述 Connection timed out: java.net.ConnectException: Connection timed out: connect java.net.PlainSocketImpl.socketConnect(Native Method) java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) java.net.PlainSocketImpl.connectToAddress(PlainSock