|
分類:[C#]
こんにちは。
以下のように、スレッドでTCPのコマンドを受信するタスクを実装しようと考えています。
うまくTCPでコマンドを受信できないのですが、アドバイスをいただけますと幸いです。
事象:
cmdRecieve内のif (server.Pending())をコメントアウトすると、うまくコマンドの受信ができる。
ただし、コマンドがこないと、client = server.AcceptTcpClient();で永久待ちになってしまう。
if (server.Pending())をコメントアウトしなければ、永久待ちはなくなる。
ただし、他のアプリからコマンドを送信すると、うまく受信してくれない。
以上、よろしくお願いいたします。
/*
* Command Thread
*/
private void cmdThread()
{
byte[] buf = new byte[40];
while (true)
{
// バッファ初期化
Array.Clear(buf, 0, buf.Length);
// データ受信
if (!cmdReceive(buf, buf.Length))
{
Thread.Sleep(100);
continue;
}
// コマンドキューに追加
que.TryAdd(buf, 1000);
Thread.Sleep(100);
}
}
/*
* コマンド受信モジュール
*/
public bool cmdReceive(byte[] buf, int bufSize)
{
TcpClient client = new TcpClient();
try
{
//サーバーを開始
Int32 port = cmdPort;
IPAddress localAddr = ipAddr;
server = new TcpListener(localAddr, port);
// サーバー開始
server.Start();
// 接続待ちがあるか判断
//if (server.Pending())
//{
// 接続
client = server.AcceptTcpClient();
// サーバー終了
server.Stop();
// }
/*else
{
// サーバー終了
server.Stop();
}*/
if (client.Connected)
{
//メッセージを受信
NetworkStream stream = client.GetStream();
stream.Read(buf, 0, bufSize);
// 接続終了
client.Close();
return true;
}
}
catch (SocketException e)
{
MessageBox.Show(e.Message);
}
return false;
}
|