首页 新闻 搜索 专区 学院

C# tcpclient异步连接的诡异问题

0
悬赏园豆:80 [待解决问题]

很诡异的问题。请看下面的tcp异步连接代码

=================================

TcpClient client = new TcpClient();

client.BeginConnect(myIPaddress, port,  new AsyncCallback(ConnectCallback), client);

public void ConnectCallback (IAsyncResult result)

{

     TcpClient client =  (TcpClient)result.AsyncState;

     client.EndConnect(result);       

     //进入回调后在远程的主机根本没有打开情况下,判断connected属性的时候会是true。

   //在远程主机端口没开放的情况下,我把tcp连接这个模块单拿出来测,

//走到这一步connected属性的时候会是false.难道是我主程序调用的问题吗?但我的程序怎么会影响到tcp连接呢?我要连接的远程端口明明没有开放。我也用netstat -a 命令查看了。求指教!非常非常困惑~如能解答不胜感激。我就91个园豆了,全拿出来,以表诚意!(系统不让我设置91个园豆,最多80,不知道为什么)

     if(client.Connected)

    {

     //todo something

    }

}

嘟嘟耕的主页 嘟嘟耕 | 初学一级 | 园豆:5
提问于:2012-10-24 10:14
< >
分享
所有回答(2)
0

没有连接上Connected这个状态一般应该是false,不过这个状态没有收发数据的时候不准,不要太依赖于这个属性。

另外,你的代码有问题,没有使用EndConnect,用上后如果连接不上应该会抛异常的,把你的代码改成这样试试。

        public void ConnectCallback(IAsyncResult result)
        {            
            TcpClient client = (TcpClient)result.AsyncState;
            
            client.EndConnect(result);        //加上这一句,如果无法连接会抛异常的

            Console.WriteLine(client.Connected);
            if (client.Connected)
            {
                //todo something
            }
        }
天方 | 园豆:5266 (大侠五级) | 2012-10-24 10:26

先谢谢您的热心解答。是在提问的时候疏忽了。在我的程序里是有这个client.EndConnect(result)语句的。还有其他可能吗?默认的connected属性为false,没有连接远程主机的情况下,为什么会变成true呢?

支持(0) 反对(0) 嘟嘟耕 | 园豆:5 (初学一级) | 2012-10-24 10:32

@嘟嘟耕: 

EndConnect没有抛异常那就是连接上了,你检查下目标主机是否真的无法连接吧。用第三方工具如telnet命令连接一下那个那个机器看看能不能连上。

支持(0) 反对(0) 天方 | 园豆:5266 (大侠五级) | 2012-10-24 10:40
0

我也遇到这个问题了 真心诡异!

hailong | 园豆:70 (初学一级) | 2014-07-26 06:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册