วิธีกำหนดค่าการหมดเวลาการเชื่อมต่อซ็อกเก็ต


105

เมื่อลูกค้าพยายามเชื่อมต่อกับที่อยู่ IP ที่ถูกตัดการเชื่อมต่อจะมีการหมดเวลานานกว่า 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);
}

คำตอบ:


147

เจอแบบนี้ ง่ายกว่าคำตอบที่ยอมรับและใช้ได้กับ. NET v2

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
ตกลงข้อมูลเล็กน้อยในอันนี้ - ฉันชอบสิ่งนี้และรหัสน้อยกว่ามาก .. อย่างไรก็ตาม! ความสำเร็จไม่ใช่เงื่อนไขที่ถูกต้อง ให้เพิ่ม if (! _socket.Connected) แทนและมันจะทำงานได้ดีขึ้นมาก ป่วยให้ +1 สำหรับมุมมองที่น้อยกว่า
TravisWhidden

2
ขึ้นอยู่กับจุดสิ้นสุดทั้งสองของคุณ หากทั้งคู่อยู่ในศูนย์ข้อมูล 1 วินาทีควรมีมาก 3 สำหรับการวัดที่ดี 10 เป็นความกรุณา หากปลายด้านหนึ่งอยู่บนอุปกรณ์เคลื่อนที่เช่นสมาร์ทโฟนคุณอาจมองไปที่ 30 วินาที
FlappySocks

3
สิ่งหนึ่งมากเกินไปมองออก ... ถ้าแทนการวางnullในสำหรับcallbackคุณและคุณวางแผนที่จะEndConnect()ถ้าซ็อกเก็ตที่ได้รับclosedแล้วนี้จะทำให้คุณมีข้อยกเว้น อย่าลืมตรวจสอบ ...
poy

9
จะเกิดอะไรขึ้นถ้าฉันต้องการเพิ่มระยะหมดเวลาแทนที่จะลดลง? ฉันคิดว่าวิธี async ช่วยให้คุณสร้างรหัสได้โดยไม่ต้องรอเป็นเวลา 20 วินาที (การหมดเวลาภายในที่ตั้งไว้ในการเชื่อมต่อซ็อกเก็ต) แต่ในกรณีที่การเชื่อมต่อใช้เวลานานขึ้น BeginConnect ก็จะหยุดอยู่ดี หรือ BeginConnect จะรอภายในตลอดไปหรือไม่ ฉันมีการเชื่อมต่อที่ช้ามากเมื่อบางครั้งจำเป็นต้องเชื่อมต่อนานถึง 30-40 วินาทีและการหมดเวลาที่วินาทีที่ 21 เกิดขึ้นบ่อยมาก
Alex

3
@TravisWhidden ยืนยันได้เลยนี่สำคัญมาก! จากประสบการณ์ของฉันหากสามารถเข้าถึงจุดสิ้นสุดได้ แต่ไม่มีเซิร์ฟเวอร์บนปลายทางที่สามารถรับการเชื่อมต่อได้AsyncWaitHandle.WaitOneจะถูกส่งสัญญาณ แต่ซ็อกเก็ตจะยังคงไม่เชื่อมต่อ
Nicholas Miller

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.
        }
    }
}

ฉันใช้เสรีภาพในการจัดการกับสภาพ หวังว่าคุณจะไม่รังเกียจ
Hemant

ต่อความเห็นเกี่ยวกับคำตอบยอดนิยมซึ่งลักษณะนี้จะเป็นสำเนาของยกเว้นว่ามันทำให้เป็นที่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
แฟนของ GhostDoc ใช่มั้ย? ;-) "Asyncs the connect" - GhostDoc WTFness แบบคลาสสิก
KeithS

1
:) ใช่และบางครั้งก็ไม่ได้อ่านสิ่งที่สร้างขึ้น
picrap

ซ็อกเก็ตที่ดีกว่า EndConnect มากกว่าซ็อกเก็ตปิด?
Kiquenet

3
socket.EndConnectใช้เวลา ~ 10 วินาทีในการปิดเพื่อให้ผลตอบแทนที่ฟังก์ชั่นไม่ได้หลังจากช่วงเวลา แต่หลังจากเวลาช่วงเวลา + endConnect
Royi Namir

8

ฉันไม่ได้ตั้งโปรแกรมใน C # แต่ใน C เราแก้ปัญหาเดียวกันโดยการทำให้ซ็อกเก็ตไม่ปิดกั้นจากนั้นใส่ fd ในลูป select / แบบสำรวจโดยมีค่าการหมดเวลาเท่ากับระยะเวลาที่เรายินดีรอการเชื่อมต่อ เพื่อประสบความสําเร็จ.

ฉันพบสิ่งนี้สำหรับ Visual C ++ และคำอธิบายยังโค้งไปยังกลไกการเลือก / การสำรวจความคิดเห็นที่ฉันอธิบายไว้ก่อนหน้านี้

จากประสบการณ์ของฉันคุณไม่สามารถเปลี่ยนค่าการหมดเวลาการเชื่อมต่อต่อซ็อกเก็ต คุณเปลี่ยนมันสำหรับทุกคน (โดยการปรับแต่งพารามิเตอร์ OS)


7

มันอาจจะสายเกินไป แต่มีวิธีแก้ปัญหาที่เรียบร้อยตาม Task.WaitAny (c # 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" เกินพิกัดใด ๆ ยอมรับโฮสต์และพอร์ตหรือไม่
marsh-wiggle

@ marsh-wiggle เมธอด "ConnectAsync" มีโอเวอร์โหลด 4 ตัวdocs.microsoft.com/en-us/dotnet/api/…โปรดดูส่วนวิธีการขยาย
Oleg Bondarenko

1
@OlegBondarenko ตกลงไม่สามารถใช้ได้กับ. net 4.5.1 ต้องห่อเองค่ะ ขอบคุณ!
marsh-wiggle

5

ฉันแก้ไขปัญหาโดยใช้ Socket.ConnectAsync Method แทน Socket.Connect Method หลังจากเรียกใช้ Socket.ConnectAsync (SocketAsyncEventArgs) ให้เริ่มตัวจับเวลา (timer_connection) หากหมดเวลาตรวจสอบว่าเชื่อมต่อซ็อกเก็ตหรือไม่ (ถ้า (m_clientSocket.Connected)) หากไม่ปรากฏข้อผิดพลาดการหมดเวลาป๊อปอัป

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
เมื่อตัวจับเวลาหยุดลงคุณจะแสดงข้อความแสดงข้อผิดพลาดใช่ไหม สิ่งนี้จะหยุดสแต็ก TCP ของคุณจากการเชื่อมต่อจริงได้อย่างไร ลองนึกภาพสถานการณ์ที่โฮสต์ระยะไกลอยู่ห่างออกไปมากกว่า 2 วินาทีเช่น rto> 2 ตัวจับเวลาของคุณจะหยุดและคุณจะพิมพ์ข้อความแสดงข้อผิดพลาด อย่างไรก็ตามตัวจับเวลาของคุณไม่ได้ควบคุม TCP จะยังคงพยายามเชื่อมต่อและอาจเชื่อมต่อสำเร็จหลังจากผ่านไป 2 วินาที C # ให้สิ่งอำนวยความสะดวกในการยกเลิกคำขอ "เชื่อมต่อ" หรือปิดซ็อกเก็ต โซลูชันตัวจับเวลาของคุณเท่ากับการตรวจสอบหลังจากผ่านไป 2 วินาทีว่าการเชื่อมต่อสำเร็จ
Aditya Sehgal

ฉันพบสิ่งนี้: splinter.com.au/blog/?p=28 ดูเหมือนจะเป็นเช่นนี้ คล้ายกับของคุณ แต่ฉันคิดว่ามันทำตามที่อธิบายไว้ข้างต้น
Aditya Sehgal

เมื่อหมดเวลาคุณควรเรียกใช้ m_clientSocket.Close ();
Vincent McNabb

อัปเดตลิงก์บล็อกของฉันที่อ้างอิงโดย aditya มีการเปลี่ยนแปลง: splinter.com.au/opening-a-tcp-connection-in-c-with-a-custom-t
คริส

ฉันจะเขียนตรรกะที่เกี่ยวข้องกับการโทร "timer_connection.Dispose ();" อีกครั้ง การอ้างอิงอ็อบเจ็กต์ timer_connection สามารถใช้งานได้หลังจากกำจัดอ็อบเจ็กต์
BoiseBaked

2

ตรวจสอบนี้บนMSDN ดูเหมือนว่าคุณสามารถทำได้ด้วยคุณสมบัติที่ใช้งานในคลาส Socket

ผู้โพสต์บน MSDN แก้ปัญหาได้จริงโดยใช้เธรด เขามีเธรดหลักซึ่งเรียกไปยังเธรดอื่นซึ่งเรียกใช้รหัสการเชื่อมต่อเป็นเวลาสองสามวินาทีจากนั้นตรวจสอบคุณสมบัติ Connected ของซ็อกเก็ต:

ฉันสร้างวิธีอื่นที่เชื่อมต่อซ็อกเก็ตจริงๆ ... ให้เธรดหลักนอนเป็นเวลา 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

ฉันทำงานกับ Unity และมีปัญหากับ BeginConnect และวิธีการ async อื่น ๆ จากซ็อกเก็ต

มีบางอย่างที่ฉันไม่เข้าใจ แต่ตัวอย่างโค้ดก่อนหน้านี้ใช้ไม่ได้กับฉัน

ฉันจึงเขียนโค้ดชิ้นนี้เพื่อให้มันใช้งานได้ ฉันทดสอบบนเครือข่าย adhoc กับ Android และพีซีในเครื่องคอมพิวเตอร์ของฉัน หวังว่ามันจะช่วยได้

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;
    }


}

และมีสุนัขเฝ้าบ้านที่เรียบง่ายมากใน C # เพื่อให้ใช้งานได้:

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 แต่ฉันได้เพิ่มการโทรกลับเข้าไปเพราะฉันไม่ชอบเค้าโครงและวิธีการส่งคืนบูลีน ในความคิดเห็นของคำตอบนั้นจาก Nick Miller:

จากประสบการณ์ของฉันหากสามารถเข้าถึงจุดสิ้นสุดได้ แต่ไม่มีเซิร์ฟเวอร์บนปลายทางที่สามารถรับการเชื่อมต่อได้ดังนั้น AsyncWaitHandle.WaitOne จะถูกส่งสัญญาณ แต่ซ็อกเก็ตจะยังคงไม่เชื่อมต่อ

เพื่อให้ฉันดูเหมือนว่าอาศัยอยู่กับสิ่งที่จะถูกส่งกลับอาจเป็นอันตรายได้ - 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

ควรมีคุณสมบัติ ReceiveTimeout ในคลาส Socket

คุณสมบัติ Socket.ReceiveTimeout


1
ฉันเหนื่อย. มันไม่ได้ผล ฉันเพิ่ม m_clientSocket.ReceiveTimeout = 1000; ก่อนเรียกใช้ m_clientSocket.Connect (ipEnd) อย่างไรก็ตามยังคงรอประมาณ 15-20 วินาทีก่อนที่จะมีข้อความแสดงข้อยกเว้นปรากฏขึ้น
ninikin

2
ตั้งค่าการหมดเวลาเมื่อซ็อกเก็ตกำลังรับข้อมูลหลังจากทำการเชื่อมต่อแล้ว
eric.christensen

1
ไม่สามารถใช้งานReceiveTimeout- นี้เป็นอย่างเคร่งครัดเมื่อได้รับด้วยและBeginReceive EndReceiveไม่มีสิ่งที่เทียบเท่าเมื่อคุณเพิ่งเห็นว่าคุณเชื่อมต่ออยู่หรือไม่
vapcguy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.