Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Socket.Connect


Автор: DEADLY 2.4.2010, 07:12
как уменьшить время на попытку подключения в Socket.Connect 
т.е. при подключении к адресу он ожидает около 10 сек и больше ,если не может приконектится,как уменьшить этот интервал ???
Код

public static String StartClient(IPAddress cIP, int port, String input)
        {
            try
            {
                int bytesRead;
                byte[] inbuf = Encoding.ASCII.GetBytes(input);
                Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                String response = String.Empty;
                StateObject state = new StateObject();

                state.workSocket = client;
                client.Connect(cIP, port);
                if (!client.Connected)
                    return "no response";
                client.Send(inbuf);
                if (!client.Poll(3000, SelectMode.SelectRead))
                {
                    return "ERROR";
                }
                bytesRead = client.Receive(state.buffer);
                response = Encoding.ASCII.GetString(state.buffer, 0, bytesRead);
                //Console.WriteLine("Answer from {0}: {1}", cIP.ToString(), response);
                client.Shutdown(SocketShutdown.Both);
                client.Close();
                return response;
            }
            catch
            {
                //if (e == System.Net.Sockets.SocketException)
                //Console.WriteLine(e.ToString());
                //Console.WriteLine("*НЕТ СВЯЗИ С КОНТРОЛЛЕРОМ {0}*", cIP.ToString());
                return "no response";
            }
        }


Автор: jonie 4.4.2010, 16:30
во-первых можно крутануть реестр: http://support.microsoft.com/default.aspx?scid=kb;en-us;120642
во-вторых в C# можно применить такой хак:
Код

public static Socket ConnectToserver(IPEndPoint endPoint, int port, int timeoutMs)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                // do not block - do not want to be forced to wait on (too- long) timeout
                socket.Blocking = false;

                // initiate connection - will cause exception because we're not  blocking
                socket.Connect(endPoint);
                return socket;
            }
            catch (SocketException socketException)
            {
                // check if this exception is for the expected 'Would Block' error
                if (socketException.ErrorCode != 10035)
                {
                    socket.Close();
                    // the error is not 'Would Block', so propogate the exception
                    throw;
                }
                // if we get here, the error is 'Would Block' so just continue  execution   }
                // wait until connected or we timeout
                int timeoutMicroseconds = timeoutMs * 1000;
                if (socket.Poll(timeoutMicroseconds, SelectMode.SelectWrite) == false)
                {
                    // timed out
                    socket.Close();
                    throw new Exception("The host failed to connect");
                }

                // *** AT THIS POINT socket.Connected SHOULD EQUAL TRUE BUT  IS FALSE!  ARGH!
                // set socket back to blocking
                socket.Blocking = true;
                return socket;
            }

        }


а вот в C++ начиная с WinXP есть ConnectEx вроде бы... кроме того можно использовать Overlapped IO .....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)