Code Bye

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 一个 Server,这需要换一个本地端口。
恩我之前是这样做的。每次定时器触发时,即将发送数据前会new一个socket,但是这样会有另外一个问题,就是当我调用receive方法接收服务器端的回送信息时回报这个错,一个封锁操作被对 WSACancelBlockingCall 的调用中断。我也并不清楚服务器端是怎么写的,您能不能帮忙分析下有可能是什么原因?
你不是说connect时候有错吗?

如果是receive有错,那么你应该检查你的服务器有没有“不小心”关闭了此通道。有时候,服务器端是短连接,而你把它当作长连接去第二次开始Receive,可能也会如此吧。如果第一次Receive就报错,你应该检查一下是不是服务程序在绑定端口时就有问题了。

引用 3 楼 sp1234 的回复:

你不是说connect时候有错吗?

如果是receive有错,那么你应该检查你的服务器有没有“不小心”关闭了此通道。有时候,服务器端是短连接,而你把它当作长连接去第二次开始Receive,可能也会如此吧。如果第一次Receive就报错,你应该检查一下是不是服务程序在绑定端口时就有问题了。

恩我的意思是按照您说的每次重新new Socket的方法。Connect就没问题了,但再第二次Receive开始时就会报错。先谢谢您了,明天再来找问题,因为是在帮老师做个小程序,服务器端是另一家公司写的,并不清楚内部怎么实现的,还要仔细问清楚


30分
引用 2 楼 u011583927 的回复:

恩我之前是这样做的。每次定时器触发时,即将发送数据前会new一个socket,但是这样会有另外一个问题,就是当我调用receive方法接收服务器端的回送信息时回报这个错,一个封锁操作被对 WSACancelBlockingCall 的调用中断。我也并不清楚服务器端是怎么写的,您能不能帮忙分析下有可能是什么原因?

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

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

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

如果你每次发送数据时都要“new”,最好不要使用 tcp。
引用 6 楼 sp1234 的回复:

如果你每次发送数据时都要“new”,最好不要使用 tcp。

由于服务器端是别人开发的,也不告我们怎么实现。不太清楚逻辑,问题还是没有解决,不过感谢您的回答,对我这个新手很有启发!~


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Socket异步连接为什么说在已经连接的套接字上请求连接