socket断线如何重连

socket断线如何重连,第1张

当Socket.Conneted == false时,调用如下函数进行判断:

///

/// 当socket.connected为false时,进一步确定下当前连接状态

/// 

/// 

private bool IsSocketConnected()

{

    #region remarks

    /********************************************************************************************

     * 当Socket.Conneted为false时, 如果您需要确定连接的当前状态,请进行非阻塞、零字节的 Send 调用。

     * 如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态; 

     * 否则,该套接字不再处于连接状态。

     * Depending on 

    ********************************************************************************************/

    #endregion

#region 过程

            // This is how you can determine whether a socket is still connected.

            bool connectState = true

            bool blockingState = socket.Blocking

            try

            {

                byte[] tmp = new byte[1]

socket.Blocking = false

                socket.Send(tmp, 0, 0)

                //Console.WriteLine("Connected!")

                connectState = true //若Send错误会跳去执行catch体,而不会执行其try体里其之后的代码

            }

            catch (SocketException e)

            {

                // 10035 == WSAEWOULDBLOCK

                if (e.NativeErrorCode.Equals(10035))

                {

                    //Console.WriteLine("Still Connected, but the Send would block")

                    connectState = true

                }

else

                {

                    //Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode)

                    connectState = false

                }

            }

            finally

            {

                socket.Blocking = blockingState

            }

//Console.WriteLine("Connected: {0}", client.Connected)

            return connectState

            #endregion

}

函数原型:int socket(int family,int type,int protocol)参数解释:family指定协议簇,UNIX下(包括linux)有:AF_INET,AF_INET6,AF_LOCAL,AF_ROUTE,AF_KEY,分别是IPv4,IPv6协议,UNIX域协议,路由套接口,密钥套接口; type指定套接口类型:unix下有四种,分别是:SOCK_STREAM,SOCK_DGRAM,SOCK_SEQPACKET,SOCK_RAW。(流套接字,数据报套接字,有序分组套接字,原始套接字),SOCK_SEQPACKET已很少使用; protocol:IPPROTO_TCP,IPPROTO_UDP,IPPROTO_SCTP,分别是TCP传输协议,UDP传输协议,SCTP传输协议; 函数返回一个非负整数值,类似于文件描述符(linux内核知识),称之为套接口描述字,简称套接字。《Linux就该这么学》这本书,希望你能感受到linux系统和这本书带给你的好处及帮助。

关闭后,要再次调用

socket(AF_INET,SOCK_STREAM,0)

来创建socket, 才可以

补充:Linux是一套免费使用和自由传播的类Unix *** 作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的 *** 作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络 *** 作系统。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8444467.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-16
下一篇 2023-04-16

发表评论

登录后才能评论

评论列表(0条)

保存