0
IPアドレスとポート番号を使用してリモートホストへの接続を確立しようとしています。私は、コードで接続を閉じようとただしたときに接続が(でもCMD netstatコマンドを使用して検証)を設立しますん:リモートホストへの接続後にTcpClientがハングし、アプリケーションがフリーズします。C#
clientConnection.Client.Close();
clientConnection.Client.Dispose();
clientConnection.Close();
プログラムがクラッシュソケットがクライアントストリームから読み取られるすべての利用可能なデータがないため。私のWindowsアプリケーション(クライアント)には、ConnectToFalconメソッドを呼び出すためにクリックするボタンがあり、そのメソッドはReadStreamメソッドを呼び出します。どこが間違っているのか教えてください。
public void readStream(object argument)
{
clientConnection = (TcpClient)argument;
//TcpClient client = new TcpClient();
DateTime start_time = DateTime.Now;
TimeSpan delay = new TimeSpan(0, 0, 10);
while (clientConnection.Available == 0)
{
Application.DoEvents();
if (DateTime.Now.Subtract(start_time) > delay)
break;
}
if ((clientConnection != null) && (clientConnection.Available > 0))
{
var message = new byte[1];
Array.Resize(ref message, clientConnection.Available);
//remove below two lines and if-statement block if program crashes
clientConnection.Client.ReceiveTimeout = 20000; //Timeout after 20 seconds
clientConnection.SendTimeout = 20000;
if (clientConnection.Client.ReceiveTimeout <= 20000 || clientConnection.SendTimeout == 20000)
{
clientConnection.Client.Receive(message);
string testResult = System.Text.Encoding.Default.GetString(message);
}
else
{
MessageBox.Show("Time expired before read operation completed.");
}
}
else if (((clientConnection == null) && (clientConnection.Available <= 0)) || (clientConnection.Connected == false))
{
clientConnection.Close();
MessageBox.Show("Closing client connection due to insufficient amount of data available to be read");
}
//clientConnection.Client.Close();
//clientConnection.Client.Dispose();
//clientConnection.Close();
}}
public void ConnectToFalcon(string IPaddress, int port)
{
clientConnection = new TcpClient();
//var result = clientConnection.BeginConnect(IPaddress, port, new AsyncCallback(callback), clientConnection);
var result = clientConnection.BeginConnect(IPaddress, port, null, null);
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1));
if (success == false)
{
MessageBox.Show("Failed to connect");
}
else
{
MessageBox.Show("Client connected...");
while (true)
{
Thread t = new Thread(readStream);
t.Start(clientConnection); //A new thread is spawned
//t.Start();
}
}
}
'(clientConnection == null)を認識するために、コールバック関数では、IAsyncResultにEndConnectを呼び出す必要があります&&(clientConnection.Available <= 0) 'これは正しく表示されません。 –
私はネットワークから受信したデータの量を確認しています。 –
しばらくは削除してください(真)。なぜそれが必要なのかわかりません... – Seabizkit