কিভাবে সকেট সংযোগের সময়সীমা কনফিগার করতে হয়


104

যখন ক্লায়েন্টটি সংযোগ বিচ্ছিন্ন আইপি ঠিকানার সাথে সংযোগ করার চেষ্টা করে, 15 সেকেন্ডেরও বেশি সময় শেষ হয় ... আমরা কীভাবে এই সময়সীমা হ্রাস করতে পারি? এটি কনফিগার করার পদ্ধতি কী?

সকেট সংযোগ স্থাপন করতে আমি যে কোডটি ব্যবহার করছি তা নিম্নরূপ:

try
{
    m_clientSocket = new Socket(
         AddressFamily.InterNetwork,
         SocketType.Stream,
         ProtocolType.Tcp);

    IPAddress ip = IPAddress.Parse(serverIp);
    int iPortNo = System.Convert.ToInt16(serverPort);
    IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo);

    m_clientSocket.Connect(ipEnd);
    if (m_clientSocket.Connected)
    {
        lb_connectStatus.Text = "Connection Established";
        WaitForServerData();
    }
}
catch (SocketException se)
{
    lb_connectStatus.Text = "Connection Failed";
    MessageBox.Show(se.Message);
}

উত্তর:


146

আমি এটি খুঁজে পেয়েছি। গৃহীত উত্তরের চেয়ে সহজ, এবং নেট ভি 2 এর সাথে কাজ করে

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

// Connect using a timeout (5 seconds)

IAsyncResult result = socket.BeginConnect( sIP, iPort, null, null );

bool success = result.AsyncWaitHandle.WaitOne( 5000, true );

if ( socket.Connected )
{
    socket.EndConnect( result );
}
else 
{
     // NOTE, MUST CLOSE THE SOCKET

     socket.Close();
     throw new ApplicationException("Failed to connect server.");
}

//... 

20
ঠিক আছে, এটিতে সামান্য ইনপুট - আমি এটি পছন্দ করি এবং এটির থেকে অনেক কম কোড .. তবে সাফল্য সঠিক শর্ত নয়। পরিবর্তে, যদি যোগ করুন (! _সকেট. সংযুক্ত) এবং এটি আরও ভাল কাজ করে। আমি কম এটিকে একটি +1 দেই কারণ এটি আরও বেশি দিক।
ট্র্যাভিসবিহীন

2
আপনার দুটি শেষ পয়েন্টের উপর নির্ভর করে। যদি তারা উভয়ই একটি ডেটাসেন্টারে থাকে তবে 1 সেকেন্ডের পরিমাণ প্রচুর পরিমাণে হওয়া উচিত, ভাল পরিমাপের জন্য 3, 10 সদয় হওয়া উচিত। স্মার্টফোনের মতো কোনও মোবাইল ডিভাইসে যদি একটি প্রান্ত থাকে তবে আপনি 30 সেকেন্ডের দিকে তাকিয়ে থাকতে পারেন।
ফ্ল্যাপিসকস

3
অন্য একটি জিনিসও সন্ধান করুন ... যদি সকেটটি nullনা রেখে callbackএবং আপনি পরিকল্পনা করে থাকেন EndConnect(), যদি সকেটটি হয়ে থাকে তবে এটি closedআপনাকে একটি ব্যতিক্রম দেয়। সুতরাং নিশ্চিত হয়ে নিন যে আপনি পরীক্ষা করেছেন ...
poy

9
আমি যদি সময়সীমাটি বাড়ানোর পরিবর্তে এটি অস্বীকার না করে চাই? আমি মনে করি async পদ্ধতির সাহায্যে আপনি কোডটি 20 সেকেন্ডের জন্য অপেক্ষা না করতে পারেন (সকেট সংযোগে অভ্যন্তরীণ সময়সীমা সেট হয়েছে)। তবে যদি সংযোগটি আরও বেশি সময় নেয়, তবে বিগনি সংযোগ যেভাবেই বন্ধ হবে। বা, বিগনকনেক্ট কি অভ্যন্তরীণভাবে চিরকাল অপেক্ষা করে? আমার সাথে খুব ধীর সংযোগ থাকে যখন কখনও কখনও সংযোগ করতে 30-40 সেকেন্ড পর্যন্ত প্রয়োজন হয় এবং 21 তম সেকেন্ডে সময়সীমা খুব ঘন ঘন ঘটে occur
অ্যালেক্স

3
@ ট্রাভিসবিহীন নিশ্চিত করতে পারেন, এটি অত্যন্ত গুরুত্বপূর্ণ! আমার অভিজ্ঞতা অনুসারে, যদি শেষ পয়েন্টটি পৌঁছানো যায় তবে সংযোগ গ্রহণ করতে সক্ষম প্রান্তে কোনও সার্ভার নেই, তবে AsyncWaitHandle.WaitOneসিগন্যাল দেওয়া হবে, তবে সকেটটি সংযুক্ত থাকবে।
নিকোলাস মিলার

29

আমার গ্রহণ:

public static class SocketExtensions
{
    /// <summary>
    /// Connects the specified socket.
    /// </summary>
    /// <param name="socket">The socket.</param>
    /// <param name="endpoint">The IP endpoint.</param>
    /// <param name="timeout">The timeout.</param>
    public static void Connect(this Socket socket, EndPoint endpoint, TimeSpan timeout)
    {
        var result = socket.BeginConnect(endpoint, null, null);

        bool success = result.AsyncWaitHandle.WaitOne(timeout, true);
        if (success)
        {
            socket.EndConnect(result);
        }
        else
        {
            socket.Close();
            throw new SocketException(10060); // Connection timed out.
        }
    }
}

আমি একটি শর্ত সামাল দিতে স্বাধীনতা গ্রহণ করেছি। আশা করি কিছু মনে করবেন না।
হেমন্ত

শীর্ষ রেটে দেওয়া উত্তরের প্রতি মন্তব্য, যা এটি একটি এ তৈরি করা বাদে এর অনুলিপি বলে মনে হচ্ছে SocketExtension, আপনি এখনও তা ব্যবহার করেননি .Connectedএবং আপনি socket.Connected = true;সংজ্ঞায়িত করতে ব্যবহার করছেন না success
vapcguy

22

সংযোগের সময়সীমাকে অনুমতি দেওয়ার জন্য আমি কেবল একটি এক্সটেনশন ক্লাস লিখেছি। আপনি Connect()অতিরিক্ত প্যারামিটার নামের সাথে মানক পদ্ধতিগুলি যেমন ব্যবহার করবেন ঠিক তেমন এটি ব্যবহার করুন timeout

using System;
using System.Net;
using System.Net.Sockets;

/// <summary>
/// Extensions to Socket class
/// </summary>
public static class SocketExtensions
{
    /// <summary>
    /// Connects the specified socket.
    /// </summary>
    /// <param name="socket">The socket.</param>
    /// <param name="host">The host.</param>
    /// <param name="port">The port.</param>
    /// <param name="timeout">The timeout.</param>
    public static void Connect(this Socket socket, string host, int port, TimeSpan timeout)
    {
        AsyncConnect(socket, (s, a, o) => s.BeginConnect(host, port, a, o), timeout);
    }

    /// <summary>
    /// Connects the specified socket.
    /// </summary>
    /// <param name="socket">The socket.</param>
    /// <param name="addresses">The addresses.</param>
    /// <param name="port">The port.</param>
    /// <param name="timeout">The timeout.</param>
    public static void Connect(this Socket socket, IPAddress[] addresses, int port, TimeSpan timeout)
    {
        AsyncConnect(socket, (s, a, o) => s.BeginConnect(addresses, port, a, o), timeout);
    }

    /// <summary>
    /// Asyncs the connect.
    /// </summary>
    /// <param name="socket">The socket.</param>
    /// <param name="connect">The connect.</param>
    /// <param name="timeout">The timeout.</param>
    private static void AsyncConnect(Socket socket, Func<Socket, AsyncCallback, object, IAsyncResult> connect, TimeSpan timeout)
    {
        var asyncResult = connect(socket, null, null);
        if (!asyncResult.AsyncWaitHandle.WaitOne(timeout))
        {
            try
            {
                socket.EndConnect(asyncResult);
            }
            catch (SocketException)
            { }
            catch (ObjectDisposedException)
            { }
        }
    }

8
ঘোস্টডোকের ফ্যান, আপনি কি? ;-) "সংযোগকে সংহত করুন" - ক্লাসিক ঘোস্টডক ডাব্লুটিএফনেস।
কিথস

1
:) হ্যাঁ, এবং কখনও কখনও এমনকি কী উত্পন্ন হয়েছে তার পাঠকও নয়।
ছবিটি তোলা

সকেটের চেয়ে আরও ভাল সকেট.এন্ড সংযোগ.ক্লোজ?
কিকিনেট

3
socket.EndConnectলাগে ~ 10 সেকেন্ডের তাই ফাংশন আয় বন্ধ করতে সময় মাপা পর কিন্তু timespan + + endConnect সময় পরে
Royi Namir

8

আমি সি # তে প্রোগ্রাম না করি, তবে সি তে, আমরা সকেটটি অ-ব্লক করে তৈরি করে এবং তারপর সংযোগের জন্য অপেক্ষা করতে প্রস্তুত হওয়া সময়ের সমান সময়সীমার সাথে একটি নির্বাচন / পোল লুপে এফডি রাখি by সাফল্য।

আমি দেখেছি এই ভিসুয়াল সি ++ এবং ব্যাখ্যা রয়েছে নির্বাচন / ভোট প্রক্রিয়া আমি আগে ব্যাখ্যা দিকে bends জন্য।

আমার অভিজ্ঞতায় আপনি প্রতি সকেট সংযোগের সময়সীমা মান পরিবর্তন করতে পারবেন না। আপনি এটি সকলের জন্য (ওএস প্যারামিটারগুলি সুর করে) পরিবর্তন করুন।


7

এটি অনেক দেরিতে হতে পারে তবে টাস্ক.ওয়েটএনি (সি # 5 +) এর উপর ভিত্তি করে ঝরঝরে সমাধান রয়েছে:

 public static bool ConnectWithTimeout(this Socket socket, string host, int port, int timeout)
        {
            bool connected = false;
            Task result = socket.ConnectAsync(host, port);               
            int index = Task.WaitAny(new[] { result }, timeout);
            connected = socket.Connected;
            if (!connected) {
              socket.Close();
            }

            return connected;
        }

কোনও "কানেক্টআরসিঙ্ক" ওভারলোড কি হোস্ট এবং পোর্ট গ্রহণ করে?
মার্শ-উইগল

@ জলাভূমি-আন্দোলিত, "ConnectAsync" পদ্ধতি রয়েছে 4 overloads docs.microsoft.com/en-us/dotnet/api/... চেহারা দয়া করে এক্সটেনশন পদ্ধতি অধ্যায়
ওলেগ Bondarenko

1
@ ওলেগবোনডেরেঙ্কো ঠিক আছে, নেট .৪.৫.১ এর পক্ষে উপলভ্য নয়। আমাকে নিজেই গুটিয়ে রাখতে হবে। ধন্যবাদ!
মার্শ-উইগল

5

আমি সকেট.কনেক্ট কানেক্টের পরিবর্তে সকেট.কনেক্টএন্সিঙ্ক পদ্ধতি ব্যবহার করে সমস্যার সমাধান করেছি। সকেট.কনেক্টএন্সিঙ্ক (সকেটঅ্যাসেন্সএভেণ্টআর্গস) -কে অনুরোধ করার পরে, টাইমার শুরু করুন (টাইমার_সংযোগ), যদি সময় শেষ হয় তবে সকেট সংযোগটি সংযুক্ত রয়েছে কিনা তা পরীক্ষা করুন (যদি (m_clientSket.Cnnected)), পপ আপ টাইমআউট ত্রুটি।

private void connect(string ipAdd,string port)
    {
        try
        {
            SocketAsyncEventArgs e=new SocketAsyncEventArgs();


            m_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPAddress ip = IPAddress.Parse(serverIp);
            int iPortNo = System.Convert.ToInt16(serverPort);
            IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo);

            //m_clientSocket.
            e.RemoteEndPoint = ipEnd;
            e.UserToken = m_clientSocket;
            e.Completed+=new EventHandler<SocketAsyncEventArgs>(e_Completed);                
            m_clientSocket.ConnectAsync(e);

            if (timer_connection != null)
            {
                timer_connection.Dispose();
            }
            else
            {
                timer_connection = new Timer();
            }
            timer_connection.Interval = 2000;
            timer_connection.Tick+=new EventHandler(timer_connection_Tick);
            timer_connection.Start();
        }
        catch (SocketException se)
        {
            lb_connectStatus.Text = "Connection Failed";
            MessageBox.Show(se.Message);
        }
    }
private void e_Completed(object sender,SocketAsyncEventArgs e)
    {
        lb_connectStatus.Text = "Connection Established";
        WaitForServerData();
    }
    private void timer_connection_Tick(object sender, EventArgs e)
    {
        if (!m_clientSocket.Connected)
        {
            MessageBox.Show("Connection Timeout");
            //m_clientSocket = null;

            timer_connection.Stop();
        }
    }

2
টাইমার বন্ধ হয়ে গেলে, আপনি ঠিক একটি ত্রুটি বার্তা দেখান? এটি কীভাবে আপনার টিসিপি স্ট্যাকটিকে আসলে সংযোগ স্থাপন থেকে থামায়। একটি দৃশ্যের কল্পনা করুন, যেখানে কোনও দূরবর্তী হোস্ট 2 সেকেন্ডেরও বেশি দূরে অর্থাৎ rto> ২. আপনার টাইমারটি বন্ধ হয়ে যাবে এবং আপনি ত্রুটি বার্তাটি মুদ্রণ করবেন। তবে, টিসিপি আপনার টাইমার দ্বারা নিয়ন্ত্রিত নয়। এটি এখনও সংযোগ দেওয়ার চেষ্টা করবে এবং 2 সেকেন্ড পরে সাফল্যের সাথে সংযুক্ত হতে পারে। সি # কি "সংযুক্ত" অনুরোধগুলি বাতিল বা সকেট বন্ধ করার জন্য কোনও সুবিধা সরবরাহ করে? আপনার টাইমার সমাধানটি সংযোগটি সফল হয়েছে কিনা 2 সেকেন্ড পরে যাচাইয়ের সমান is
আদিত্য সেহগল

আমি এটি খুঁজে পেয়েছি: splinter.com.au/blog/?p=28 দেখে মনে হচ্ছে এটি উপায়। এটি আপনার অনুরূপ তবে আমি মনে করি এটি আমি উপরে বর্ণিত হিসাবে এটি করে।
আদিত্য সেহগাল

সময় শেষ হয়ে গেলে, আপনাকে m_clientSket.Close () কল করা উচিত;
ভিনসেন্ট ম্যাকনাব

আপডেট, আদিত্যের উল্লেখ হিসাবে আমার ব্লগের লিঙ্কটি পরিবর্তিত হয়েছে: splinter.com.au/opening-a-tcp-conn
ক্রিস

আমি "টাইমার_সংযোগ.ডিসপোজ ();" কল সম্পর্কিত যুক্তিটি আবার লিখতে চাই। টাইমার_সংযোগ অবজেক্ট রেফারেন্সটি অবজেক্টটি নিষ্পত্তি হওয়ার পরে সম্ভবত ব্যবহৃত হয়।
বোইসবেড

2

এই পরীক্ষা করে দেখুন দুটিই MSDN । এটি সকেট শ্রেণিতে প্রয়োগকৃত বৈশিষ্ট্যগুলির সাথে করতে পারেন বলে মনে হয় না।

এমএসডিএন-এর পোস্টারটি থ্রেডিং ব্যবহার করে তার সমস্যার সমাধান করেছিল । তার একটি মূল থ্রেড ছিল যা অন্যান্য থ্রেডগুলিতে ডেকেছিল যা সংযোগ কোডটি কয়েক সেকেন্ডের জন্য চালায় এবং তারপরে সকেটের সংযুক্ত সম্পত্তিটি পরীক্ষা করে:

আমি আর একটি পদ্ধতি তৈরি করেছি যা প্রকৃতভাবে সকেটটি সংযুক্ত ছিল ... মূল সারণিটি 2 সেকেন্ডের জন্য ঘুমিয়ে ছিল এবং তারপরে সংযোগ পদ্ধতিটি পরীক্ষা করুন (যা পৃথক থ্রেডে চালিত হয়) যদি সকেটটি ভালভাবে সংযুক্ত থাকে তবে একটি ব্যতিক্রম "সময়সীমা" ফেলে দিন এবং যে সব. রিপ্লাইগুলির জন্য আবার ধন্যবাদ

আপনি কী করতে চেষ্টা করছেন এবং সময় নির্ধারণের আগে কেন এটি 15-30 সেকেন্ড অপেক্ষা করতে পারে না?


2

সকেটের সাথে সংযোগ করার সময় আমারও একই সমস্যা হয়েছিল এবং আমি নীচের সমাধানটি নিয়ে এসেছি, এটি আমার পক্ষে দুর্দান্ত কাজ করে। `

private bool CheckConnectivityForProxyHost(string hostName, int port)
       {
           if (string.IsNullOrEmpty(hostName))
               return false;

           bool isUp = false;
           Socket testSocket = null;

           try
           {

               testSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
               IPAddress ip = null;
               if (testSocket != null && NetworkingCollaboratorBase.GetResolvedConnecionIPAddress(hostName, out ip))//Use a method to resolve your IP
               {
                   IPEndPoint ipEndPoint = new IPEndPoint(ip, port);

                   isUp = false;
//time out 5 Sec
                  CallWithTimeout(ConnectToProxyServers, 5000, testSocket, ipEndPoint);

                       if (testSocket != null && testSocket.Connected)
                       {
                           isUp = true;
                       }
                   }

               }
           }
           catch (Exception ex)
           {
               isUp = false;
           }
           finally
           {
               try
               {
                   if (testSocket != null)
                   {
                       testSocket.Shutdown(SocketShutdown.Both);
                   }
               }
               catch (Exception ex)
               {

               }
               finally
               {
                   if (testSocket != null)
                       testSocket.Close();
               }

           }

           return isUp;
       }


 private void CallWithTimeout(Action<Socket, IPEndPoint> action, int timeoutMilliseconds, Socket socket, IPEndPoint ipendPoint)
       {
           try
           {
               Action wrappedAction = () =>
               {
                   action(socket, ipendPoint);
               };

               IAsyncResult result = wrappedAction.BeginInvoke(null, null);

               if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds))
               {
                   wrappedAction.EndInvoke(result);
               }

           }
           catch (Exception ex)
           {

           }
       }

  private void ConnectToProxyServers(Socket testSocket, IPEndPoint ipEndPoint)
       {
           try
           {
               if (testSocket == null || ipEndPoint == null)
                   return;

                   testSocket.Connect(ipEndPoint);

           }
           catch (Exception ex)
           {

           }
       } 

1

আমি ityক্যের সাথে কাজ করেছি এবং সকেট থেকে বিগনি কানেক্ট এবং অন্যান্য এসিঙ্ক পদ্ধতিতে কিছু সমস্যা ছিল।

এমন কিছু আছে যা আমি বুঝতে পারি না তবে কোড নমুনাগুলি আমার পক্ষে কাজ করে না।

সুতরাং আমি কোডটির এই অংশটি লিখেছি এটি কাজ করে। আমি এটিকে অ্যান্ড্রয়েড এবং পিসি সহ একটি অ্যাডহক নেটওয়ার্কে পরীক্ষা করি, আমার কম্পিউটারে স্থানীয়। আশা করি এটি সাহায্য করতে পারে।

using System.Net.Sockets;
using System.Threading;
using System.Net;
using System;
using System.Diagnostics;

class ConnexionParameter : Guardian
{
    public TcpClient client;
    public string address;
    public int port;
    public Thread principale;
    public Thread thisthread = null;
    public int timeout;

    private EventWaitHandle wh = new AutoResetEvent(false);

    public ConnexionParameter(TcpClient client, string address, int port, int timeout, Thread principale)
    {
        this.client = client;
        this.address = address;
        this.port = port;
        this.principale = principale;
        this.timeout = timeout;
        thisthread = new Thread(Connect);
    }


    public void Connect()
    {
        WatchDog.Start(timeout, this);
        try
        {
            client.Connect(IPAddress.Parse(address), port);

        }
        catch (Exception)
        {
            UnityEngine.Debug.LogWarning("Unable to connect service (Training mode? Or not running?)");
        }
        OnTimeOver();
        //principale.Resume();
    }

    public bool IsConnected = true;
    public void OnTimeOver()
    {
        try
        {
            if (!client.Connected)
            {
                    /*there is the trick. The abort method from thread doesn't
 make the connection stop immediately(I think it's because it rise an exception
 that make time to stop). Instead I close the socket while it's trying to
 connect , that make the connection method return faster*/
                IsConnected = false;

                client.Close();
            }
            wh.Set();

        }
        catch(Exception)
        {
            UnityEngine.Debug.LogWarning("Connexion already closed, or forcing connexion thread to end. Ignore.");
        }
    }


    public void Start()
    {

        thisthread.Start();
        wh.WaitOne();
        //principale.Suspend();
    }

    public bool Get()
    {
        Start();
        return IsConnected;
    }
}


public static class Connexion
{


    public static bool Connect(this TcpClient client, string address, int port, int timeout)
    {
        ConnexionParameter cp = new ConnexionParameter(client, address, port, timeout, Thread.CurrentThread);
        return cp.Get();
    }

//http://stackoverflow.com/questions/19653588/timeout-at-acceptsocket
    public static Socket AcceptSocket(this TcpListener tcpListener, int timeoutms, int pollInterval = 10)
    {
        TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutms);
        var stopWatch = new Stopwatch();
        stopWatch.Start();
        while (stopWatch.Elapsed < timeout)
        {
            if (tcpListener.Pending())
                return tcpListener.AcceptSocket();

            Thread.Sleep(pollInterval);
        }
        return null;
    }


}

এটি কার্যকর করতে সি # তে খুব সাধারণ ওয়াচডগ রয়েছে:

using System.Threading;

public interface Guardian
{
    void OnTimeOver();
}

public class WatchDog {

    int m_iMs;
    Guardian m_guardian;

    public WatchDog(int a_iMs, Guardian a_guardian)
    {
        m_iMs = a_iMs;
        m_guardian = a_guardian;
        Thread thread = new Thread(body);
        thread.Start(this);
    }


    private void body(object o)
    {
        WatchDog watchdog = (WatchDog)o;
        Thread.Sleep(watchdog.m_iMs);
        watchdog.m_guardian.OnTimeOver();
    }

    public static void Start(int a_iMs, Guardian a_guardian)
    {
        new WatchDog(a_iMs, a_guardian);
    }
}

1

এটি FlappySock এর উত্তরের মতো, তবে আমি এতে একটি কলব্যাক যুক্ত করেছি কারণ আমি লেআউটটি পছন্দ করি নি এবং কীভাবে বুলিয়ান ফিরে আসছিল। নিক মিলারের সেই উত্তরটির মন্তব্যে:

আমার অভিজ্ঞতা অনুসারে, যদি শেষ পয়েন্টে পৌঁছানো যায় তবে সংযোগ গ্রহণ করতে সক্ষম প্রান্তে কোনও সার্ভার নেই, তবে অ্যাসিঙ্কওয়েটহ্যান্ডল aউইটঅন সংকেত দেওয়া হবে, তবে সকেটটি সংযুক্ত থাকবে না

সুতরাং আমার কাছে মনে হয় যা ফিরিয়ে দেওয়া হয়েছে তার উপর নির্ভর করা বিপজ্জনক হতে পারে - আমি ব্যবহার করতে পছন্দ করি socket.Connected। আমি একটি বুননযোগ্য বুলিয়ান সেট করেছি এবং কলব্যাক ফাংশনে এটি আপডেট করি। আমি আরও জানতে পেরেছিলাম যে মূল ফাংশনে ফিরে আসার আগে ফলাফলের প্রতিবেদন করা সবসময় শেষ হয় না - আমি এটির জন্যও হ্যান্ডেল করি এবং সময়সীমা ব্যবহার করে ফলাফলের জন্য অপেক্ষা করতে বাধ্য করি:

private static bool? areWeConnected = null;

private static bool checkSocket(string svrAddress, int port)
{
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(svrAddress), port);
    Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

    int timeout = 5000; // int.Parse(ConfigurationManager.AppSettings["socketTimeout"].ToString());
    int ctr = 0;
    IAsyncResult ar = socket.BeginConnect(endPoint, Connect_Callback, socket);
    ar.AsyncWaitHandle.WaitOne( timeout, true );

    // Sometimes it returns here as null before it's done checking the connection
    // No idea why, since .WaitOne() should block that, but it does happen
    while (areWeConnected == null && ctr < timeout)
    {
        Thread.Sleep(100);
        ctr += 100;
    } // Given 100ms between checks, it allows 50 checks 
      // for a 5 second timeout before we give up and return false, below

    if (areWeConnected == true)
    {
        return true;
    }
    else
    {
        return false;
    }
}

private static void Connect_Callback(IAsyncResult ar)
{
    areWeConnected = null;
    try
    {
        Socket socket = (Socket)ar.AsyncState;
        areWeConnected = socket.Connected;
        socket.EndConnect(ar);
    }
    catch (Exception ex)
    {
      areWeConnected = false;
      // log exception 
    }
}

সম্পর্কিত: আমি সংযুক্ত কিনা তা কীভাবে চেক করব?


-8

সকেট শ্রেণিতে একটি রিসিপটাইমআউট সম্পত্তি থাকা উচিত।

সকেট। রিসিপটাইমআউট সম্পত্তি


1
আমি চেষ্টা করেছিলাম. এটা ঠিক কাজ করে না। আমি m_clientSket.Reসেপ্টটাইমআউট = 1000 যোগ করেছি; m_clientSket.Connect (ipEnd) শুরু করার আগে। তবে এটি ব্যতিক্রম বার্তাটি পপআপের আগে প্রায় 15-20 সেকেন্ড অপেক্ষা করে।
নিনিকিন

2
এটি সংযোগটি তৈরি হওয়ার পরে সকেট কখন ডেটা গ্রহণ করবে তার সময়সীমা নির্ধারণ করে।
এরিক.চ্রিস্টেনসেন

1
ব্যবহার করা যাবে না ReceiveTimeout- এই যখন সঙ্গে প্রাপ্তির জন্য কঠোরভাবে হয় BeginReceiveএবং EndReceive। আপনি কেবল সংযুক্ত আছেন কিনা তা দেখার জন্য কোনও সমতুল্য নেই।
vapcguy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.