当前位置: 代码迷 >> C# >> 关于Socket异步连接的有关问题
  详细解决方案

关于Socket异步连接的有关问题

热度:68   发布时间:2016-05-05 04:30:38.0
关于Socket异步连接的问题
我仅仅说下出错这块的逻辑。我要做的就是调用Socket.BeginConnect来连接远程服务器。
我的程序要隔一段时间发送一次数据,发送前要判断下现在是不是连接状态,不是的话先调用连接方法。
当我第一次开启我的定时发送功能,调用下面的Connect方法成功连接了。然后后面会发送些数据,等到一段固定时间后,需要再次发送数据,由于已经隔了一段时间,先调用了IsConnected,返回值为false未连接,所有再次调用了Connect方法,结果报的错误为在一个已经连接的套接字上做连接请求小弟这里非常不解,Connected属性明明为false,为什么说在已经连接的套接字上请求连接,还请各位大神赐教
主要代码如下:Server就是我的socket变量
        /// <summary>
        /// 连接是否开启
        /// </summary>
        public bool IsConnected
        {
            get
            {
                if (Server != null)
                {
                    return Server.Connected;
                }
                else
                    return false;
            }
        }
        /// <summary>
        /// 开启连接
        /// </summary>
        /// <param name="connectionProperty">连接属性</param>
        /// <returns>返回连接是否成功</returns>
        public bool Connect(ConnectProperty connectionProperty)
        {
            if (!IsConnected)
            {
                //这里没有连接才会进来,觉得与后面报的错冲突,小弟十分不解
                //Server.Connect(connectionProperty.IP, connectionProperty.Port);
                IPEndPoint iep = new IPEndPoint(connectionProperty.IP, connectionProperty.Port);
                IAsyncResult ar = Server.BeginConnect(iep, new AsyncCallback(Connected), Server);//这是出错的语句!!!
                //后面是判断是否连接成功,与问题无关
            }
            else
            {
                //连接已经开启
                return true;
            }
        }
------解决思路----------------------
引用:
恩我之前是这样做的。每次定时器触发时,即将发送数据前会new一个socket,但是这样会有另外一个问题,就是当我调用receive方法接收服务器端的回送信息时回报这个错,一个封锁操作被对 WSACancelBlockingCall 的调用中断。我也并不清楚服务器端是怎么写的,您能不能帮忙分析下有可能是什么原因?


基本上,如果使用 tcp,那么应该保持长连接。

如果你使用短链接,那么使用简单的 http 甚至 udp 都可以。而且 udp 编程代码至少比 tcp 少一半,非常简单。而http 则是不但简单(只需要写一句 new WebClient().UploadData(url,data) 语句)也相当稳定(只不过http会比udp慢一些而已)。

我们使用 tcp 的目的就是为了长连接,(尤其在互联网上)服务器推送消息。tcp 编程是最复杂的,一开始遇到的bug最多。
  相关解决方案