C# Socket 连接超时问题!

sky3333ss 2010-09-02 10:38:49
写了个及时通讯软件 但是在Socekt.Connet()时 如果是没有这个ip的话 程序像死机了一样!不动!大概30秒左右才行,能不能设置超时时间 让他在3秒左右就做出回应! 用过Socket.SendTimeout=2000; 好像不起作用!
...全文
1727 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky3333ss 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yyd021 的回复:]
我只是说我的局域网,经过多次测试的数据,有什么武断,又没有说所有的人都是21秒。
比如我的IP是192.168.1.135,而在局域网中有一台电脑的IP是192.168.1.35。如果该电脑没有开机,实际上局域网目前是不存在35这个IP地址的,如果我用默认的同步或者异步连接去连接,等提示连接不到指定IP的时候就是这个数值。而192.168.1.35开机,但不提供我指定端口的TCP连接服务时,这时……
[/Quote]

Thanks 问题解决了,就是用你的方法的!十分感谢了!
sky3333ss 2010-09-07
  • 打赏
  • 举报
回复

socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ipSend = new IPEndPoint(IPAddress.Parse(ip), port);
socketSend.Connect(ipSend);
socketSend.Send(Encoding.Default.GetBytes(msg));


各位大哥 看看这段代码中的socketSend.Connect() 怎么能做到超过3秒就抛异常呢?谢谢谢谢!
  • 打赏
  • 举报
回复
其实很简单,几乎每个人都是用过QQ、MSN,那么有多少时间在无法联网时“稳定在21秒”才报告网络有问题?
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yyd021 的回复:]
同样的问题,我也遇到。经过测试我的电脑稳定在21秒左右才有异常,而对于局域网内已经存在的IP,我测试的结果是1.2秒左右返回异常。你说的这个死机一样的问题可以用多线程解决,我的想法是,能不能修改某个参数,使不管在任何情况下,都能在2~3秒能返回异常。
[/Quote]

太武断了吧。

这样吧,你把你的“局域网内不存在的IP”是什么写出来吧。实际上可以看看到底是什么IP,要走什么哪些路由器。“稳定在21秒”?呵呵,让其它人也测试测试。
yyd021 2010-09-04
  • 打赏
  • 举报
回复
用异步通讯方式,如果连接超时就关掉连接


using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace TcpClientClass
{
public class ReadObject
{
//public Socket workSoket =null;
public int bytesize = 256;
public byte[] bytes;
public NetworkStream netStream;

public ReadObject(NetworkStream ns, int size)
{
bytesize = size;
bytes = new byte[bytesize];
netStream = ns;
}
}

class ConnectToServer
{
private TcpClient client;
private EventWaitHandle allDone = new EventWaitHandle(false, EventResetMode.ManualReset);
private NetworkStream ns;
private DateTime timer;
private bool isExit = false;

public void ConnectTo(IPAddress ip, int port)
{
client = new TcpClient(AddressFamily.InterNetwork);
try
{
timer = DateTime.Now;
allDone.Reset();
client.BeginConnect(ip, port, RequestCallback, client);

if (!allDone.WaitOne(2000, false))
{
client.Close();
throw new SocketException(10060);
}
}
catch (Exception e1)
{
Console.WriteLine(e1.Message);
}
}

public void RequestCallback(IAsyncResult ar)
{
allDone.Set();
try
{
client = (TcpClient)ar.AsyncState;
TimeSpan timeduration = DateTime.Now - timer;
Console.WriteLine("连接时间:" + timeduration.TotalSeconds.ToString());
Console.WriteLine("连接成功" + client.Client.RemoteEndPoint.ToString() + "\n");
ns = client.GetStream();
ReadObject readObject = new ReadObject(ns, client.ReceiveBufferSize);
ns.BeginRead(readObject.bytes, 0, readObject.bytes.Length, ReadCallback, readObject);
}
catch (Exception e1)
{
TimeSpan timeduration = DateTime.Now - timer;
Console.WriteLine("连接时间:" + timeduration.TotalSeconds.ToString());
Console.WriteLine(e1.Message);
return;
}
}

public void ReadCallback(IAsyncResult ar)
{
try
{
ReadObject ro = (ReadObject)ar.AsyncState;
int count = ro.netStream.EndRead(ar);
Console.WriteLine("接收到:" + System.Text.Encoding.UTF8.GetString(ro.bytes, 0, count));
if (isExit == false)
{
ro = new ReadObject(ns, client.ReceiveBufferSize);
ns.BeginRead(ro.bytes, 0, ro.bytes.Length, ReadCallback, ro);
}
}
catch (Exception e2)
{
Console.WriteLine(e2.Message);
return;
}
}

private void SendString(string str)
{
try
{
byte[] by = System.Text.Encoding.UTF8.GetBytes(str);
ns.BeginWrite(by, 0, by.Length, new AsyncCallback(SendCallBack), ns);
ns.Flush();
}
catch (Exception e3)
{
Console.WriteLine(e3.Message);
//MessageBox.Show(e3.ToString());
return;
}
}
//发送数据回调的方法
private void SendCallBack(IAsyncResult ar)
{
try
{
ns.EndWrite(ar);
}
catch (Exception e4)
{
Console.WriteLine(e4.Message);
return;
}
}
}
}
yyd021 2010-09-04
  • 打赏
  • 举报
回复
我只是说我的局域网,经过多次测试的数据,有什么武断,又没有说所有的人都是21秒。
比如我的IP是192.168.1.135,而在局域网中有一台电脑的IP是192.168.1.35。如果该电脑没有开机,实际上局域网目前是不存在35这个IP地址的,如果我用默认的同步或者异步连接去连接,等提示连接不到指定IP的时候就是这个数值。而192.168.1.35开机,但不提供我指定端口的TCP连接服务时,这时一样1秒多点就可以返回连接失败的异常。
上面这个问题,我在前面贴的代码中,使用了
if (!allDone.WaitOne(2000, false))
{
client.Close();
throw new SocketException(10060);
}
语句,如果在指定的时候没有返回,那我就自己提前抛出连接错误。然后依据错误关闭当前连接,实现了按指定时间超时的目的。
sky3333ss 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yyd021 的回复:]
同样的问题,我也遇到。经过测试我的电脑稳定在21秒左右才有异常,而对于局域网内已经存在的IP,我测试的结果是1.2秒左右返回异常。你说的这个死机一样的问题可以用多线程解决,我的想法是,能不能修改某个参数,使不管在任何情况下,都能在2~3秒能返回异常。
[/Quote]

这位大哥请问用多线程怎么解决呢?说详细点 谢谢了
yyd021 2010-09-03
  • 打赏
  • 举报
回复
同样的问题,我也遇到。经过测试我的电脑稳定在21秒左右才有异常,而对于局域网内已经存在的IP,我测试的结果是1.2秒左右返回异常。你说的这个死机一样的问题可以用多线程解决,我的想法是,能不能修改某个参数,使不管在任何情况下,都能在2~3秒能返回异常。
sky3333ss 2010-09-03
  • 打赏
  • 举报
回复
继续等……
CGabriel 2010-09-02
  • 打赏
  • 举报
回复
开个新线程去 Connect,如果两三秒都没有反应,就把那个线程丢到一二角去,不要理会了。
sky3333ss 2010-09-02
  • 打赏
  • 举报
回复
着急啊 在线等着呢!
sky3333ss 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sp1234 的回复:]
正常情况下,socket的tcp的connect肯定会在2、3秒钟之内返回异常(我印象中windows会在半秒钟内抛出异常)。所以看看你自己的程序,并且多写几个其它类型的测试。
[/Quote]

调试时 是20多秒 不是2-3秒 ,Socket.connect() 如果是2-3秒 那我也可以直接catch着了,
sky3333ss 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sp1234 的回复:]
正常情况下,socket的tcp的connect肯定会在2、3秒钟之内返回异常(我印象中windows会在半秒钟内抛出异常)。所以看看你自己的程序,并且多写几个其它类型的测试。
[/Quote]

我调试时不时2-3秒 确实是20多秒啊 ,(是个没有的ip)
  • 打赏
  • 举报
回复
正常情况下,socket的tcp的connect肯定会在2、3秒钟之内返回异常(我印象中windows会在半秒钟内抛出异常)。所以看看你自己的程序,并且多写几个其它类型的测试。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sky1989ss 的回复:]
引用 4 楼 wgsnet 的回复:
多线程 解决


多线程怎么解决啊 ? 能不能稍微详细点啊
[/Quote]

没有任何意义。
那些根本没有懂你说的“程序像死机了一样!不动!大概30秒左右”是什么意思。
sky3333ss 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wgsnet 的回复:]
多线程 解决
[/Quote]

多线程怎么解决啊 ? 能不能稍微详细点啊
APP开发王 2010-09-02
  • 打赏
  • 举报
回复
多线程 解决
sky3333ss 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cloudhsu 的回复:]
SendTimeout是传输数据用的
http://blog.csdn.net/cloudhsu/archive/2010/08/12/5807176.aspx
参考这篇
[/Quote]

这位大哥 你写的那个日子稍微有点不明白啊
云瑀 2010-09-02
  • 打赏
  • 举报
回复
SendTimeout是传输数据用的
http://blog.csdn.net/cloudhsu/archive/2010/08/12/5807176.aspx
参考这篇

110,537

社区成员

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

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

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