【发布时间】:2014-04-14 18:53:10
【问题描述】:
我正在编写一个相当简单的 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 立即返回并且我收到错误消息
无法建立连接,因为目标机器主动拒绝它 127.0.0.1:50042
谁能告诉我我可以做些什么来让这个异步连接等待服务器应用程序?提前致谢。
【问题讨论】:
-
前段时间写了一个异步TCP服务器的例子,可能有用:github.com/vtortola/AynchronousTCPListener
标签: c# multithreading sockets tcp