gpt4 book ai didi

c# - 如何在启动 TCP 服务器之前优雅地启动 C# TCP 客户端

转载 作者:可可西里 更新时间:2023-11-01 02:47:02 26 4
gpt4 key购买 nike

我正在编写一个相当简单的 TCP/IP 客户端应用程序。当我启动服务器(另一个单独的应用程序)然后按该顺序启动客户端时,我能够成功连接。我想让客户端变得健壮,这样我就可以先启动它并且它不会中断。此外,我不想要一个特殊的用户操作来告诉客户端尝试连接。我还想在客户端使用非阻塞异步 IO。

为了尝试完成此操作,我尝试使用 Socket.BeginConnect 方法。我的意图是此调用将生成一个后台线程,该线程将在 EndConnect 调用中被阻塞,直到建立连接为止。这样我的客户端就可以在启动时调用这个方法,然后继续运行。这是我的代码:

public bool Init_Port(string Host)
{
IPHostEntry ipHostInfo = Dns.Resolve(Host);
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, PORT);

try
{
//Create the connection
My_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

My_Socket.BeginConnect(localEndPoint, new AsyncCallback(Connect_To_Port), My_Socket);

}
catch (Exception e)
{
ErrorHandler(e.Message);
return false;
}
return true;
}

private void Connect_To_Port(IAsyncResult ar)
{
try
{
if (My_Socket != null)
{
//will block the thread until a connection is made
My_Socket.EndConnect(ar);

Connection_Flag = true;

//Setup the asynchronous read
My_Socket.BeginReceive(Rx_Buffer, 0, SOCKET_BUFFER_SIZE, 0,
new AsyncCallback(Read_Port), My_Socket );
}
}
catch (Exception e)
{
ErrorHandler(e.Message);
}
}

我在不启动服务器应用程序的情况下进行测试。我希望线程将在 EndConnect 处被阻塞,直到我的服务器应用程序启动。我观察到 EndConnect 立即返回并且我收到错误消息

No connection could be made because the target machine actively refused it 127.0.0.1:50042

谁能告诉我如何让这个异步连接等待服务器应用程序?提前致谢。

最佳答案

Can anyone tell me what I can do to make this asynchronous connect wait for the server application?

没有。你每隔 X 秒循环运行一次,直到它开始或者你得到一个逻辑超时。 TCP 不会等待,您必须重试。

关于c# - 如何在启动 TCP 服务器之前优雅地启动 C# TCP 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23067971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com