C# 使用插座连接到同一端点

C# 使用插座连接到同一端点,c#,sockets,client,endpoint,reconnect,C#,Sockets,Client,Endpoint,Reconnect,我正在使用客户端TCP/IP应用程序中的类将我的客户端连接到服务器 我有以下代码: var endPoint = new IPEndPoint(IPAddress.Parse(IP), port); var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.Connect(endPoint); try {

我正在使用客户端TCP/IP应用程序中的类将我的客户端连接到服务器

我有以下代码:

var endPoint = new IPEndPoint(IPAddress.Parse(IP), port);
var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
                        ProtocolType.Tcp);

client.Connect(endPoint);

try
{
    while (true)
    {
        // Do work...
        // Receive/Send data from/to server
    }
}
catch (SocketException)
{
    /* At some point the server disconnects...
    Exception catched because the server close the connection
    Socket error 10054 - WSAECONNRESET */

    // So I try to reconnect
    if(client.Connected == false)
    {
        /* The following line throws a InvalidOperationException.
        Message: After disconnecting the socket, you can reconnect only 
        asynchronously from a different EndPoint. BeginConnect must be 
        called on a thread that will not close until the operation completes.*/
        client.Connect(endPoint);   

        /* So I try instead Socket.BeginConnect, but the following line
        throws a SocketException 10061 - WSAECONNREFUSED */
        client.BeginConnect(endPoint, ConnectCallback, client);

        /* And also the following code throws a 
            SocketException 10061 - WSAECONNREFUSED */
        client = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
                                ProtocolType.Tcp);
        client.Connect(endPoint);
    }
} 
套接字错误列表。


因此,在服务器关闭连接的某个时刻,我需要知道什么是最好的方法来知道服务器何时准备好接受另一个连接以及如何再次连接到同一个端点。

WSAECONNREFUSED意味着,服务器不接受您的连接请求


您必须重试,才能在两次重试之间休眠几秒钟的循环中连接。客户端无法在不尝试连接的情况下知道服务器何时重新可用。

WSAECONNREFUSED意味着服务器不接受您的连接请求


您必须重试,才能在两次重试之间休眠几秒钟的循环中连接。如果不尝试连接,客户端无法知道服务器何时可用。

我也在考虑相同的解决方案,但是。您可以做任何您想做的事情,但是您绝对不应该在一个紧密的循环中调用
client.connect()
。当你在后台线程中进行连接时,没有什么可以反对使用
线程。Sleep
。但是我必须创建一个新的套接字吗?@Nick看看这个问题:。我认为处理旧的套接字和创建新的套接字是更简单的方法。我也在考虑同样的解决方案,但是。你可以做任何你想做的事情,但是你绝对不应该在一个紧密的循环中调用
client.Connect()
。当你在后台线程中进行连接时,没有什么可以反对使用
线程。Sleep
。但是我必须创建一个新的套接字吗?@Nick看看这个问题:。我认为处理旧的和创造一个新的插座是比较容易的方法。