求助!我用C#写一个Socket客户端程序,在尝试连接服务器端的时候,如何避免如果服务器端不在线使得客户端Connect操作一直处于等待状态使得程序停滞不前的问题呢?我尝试了把Socket设定为非阻塞状态,但如果服务器端不在线就会报错“无法立即完成一个非阻挡性套接字操作”,请问各位如何解决客户端在尝试连接服务器端时,如果服务器不在线的话能及时发现并处理的问题呢?总不能每次执行到Socket.Connect时就一直停滞不前吧?关键代码如下
                IPAddress serverIPAddress = IPAddress.Parse("192.168.0.42");
                IPEndPoint serverIP = new IPEndPoint(serverIPAddress, 7777);
                Socket skserver = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
               
                try
                {
                    Console.WriteLine("Waiting for connection……");
                    skserver.Blocking = false;//设定为非阻塞状态
                    skserver.Connect(serverIP);
                    
                    Console.WriteLine("Connection accepted.");
                }
                catch (Exception se)
                {
                    Console.WriteLine("连接错误:" + se.Message);
                }
这时如果服务器不在线,就报错:
连接错误:无法立即完成一个非阻挡性套接字操作。
System.IO.IOException:不允许对非阻止套接字执行此操作。

解决方案 »

  1.   

    这个简单,你可以用异步的socket连接啊,socket.ConnectAsync,一下是基于事件的异步socket连接,你可以试一试,这个是我重我项目里面拷贝出来的        public SocketServer(MessageType messageType, string SvIP, int Sport)
            {
                messType = messageType;
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化SOCKET
                //socket.Bind(localEP);//绑定网络地址
                ConnectEventArgs = new SocketAsyncEventArgs();//异步连接
                ConnectEventArgs.RemoteEndPoint = new DnsEndPoint(SvIP, Sport);//设定和Server的通讯地址和端口
                ConnectEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnSocketConnectCompleted);//连接完成后做出OnSocketConnectCompleted报告。
                socket.ConnectAsync(ConnectEventArgs);//开始异步连接
            }  //完成连接的处理函数
      void OnSocketConnectCompleted(object sender, SocketAsyncEventArgs e)
            {
                try
                {
                    Socket clientSk = sender as Socket;
                    if (e.SocketError == SocketError.Success)
                    {
                        //写你的逻辑代码
                    }
                }
                catch (Exception ex) { AppClass.WriteFile(ex.ToString()); }
            }