-1
私はソケットを初めて使用しています。これはサーバーからデータを送受信するコードです。TcpClientソケットでのエラー処理
このコードクライアントがサーバーからデータを受信できる限り、このコードは正常に動作します。
サーバーが一定時間内に応答を返さない場合、アプリケーションは「応答なし」を送信する必要があります。
recvBufferが空かNULLかどうかをどのように知ることができますか?
現在、recvBufferのif条件が機能せず、アプリケーションが "System.IndexOutOfRangeException error"という結果をもたらす空のバッファを送信しようとします。
class GetSocket
{
public string SocketSendReceive(string server, int port, string cmd)
{
byte[] recvBuffer = new byte[1024];
TcpClient tcpClient = new TcpClient();
tcpClient.Client.ReceiveTimeout = 200;
try
{
tcpClient.Connect(server, 6100);
}
catch (SocketException e)
{
MessageBox.Show(e.Message);
}
if (tcpClient != null && tcpClient.Connected)
{
try
{
tcpClient.Client.Send(Encoding.UTF8.GetBytes(cmd));
tcpClient.Client.Receive(recvBuffer);
}
catch (SocketException e)
{
MessageBox.Show(e.ErrorCode.ToString());
}
tcpClient.GetStream().Close();
tcpClient.Client.Close();
tcpClient.Client.Dispose();
tcpClient = null;
string tmp = Encoding.ASCII.GetString(recvBuffer, 0, recvBuffer.Length);
if (recvBuffer != null && recvBuffer.Length > 0)
{
string[] words = tmp.Split(null);
return words[1];
}
else
{
return ("No Answer Received");
}
}
return null;
}
}
停止(あなたがそれを変更するには何もしたことがないことから、非nullで、長さが1024バイトで_always_ます)、およびそのすべてのデコードのものは 'しようとして行くあなたのコードをリファクタリング受信バッファを見て'応答("無回答... ")'部分は 'catch'ブロックに入りますが、' Receive() '呼び出しの後でブロックします。スローされる 'SocketException'は、タイムアウトが発生したことを通知するものです。詳細については、[the documentation](https://msdn.microsoft.com/en-us/library/8s4y8aff(v = vs.110).aspx) –
を参照してください。私はあなたから提案された変更を加えました。 –
問題を自分で解決した場合は、問題の内容と解決方法を説明した回答を投稿し、その回答に合格とマークしてください。 –