0
私は2つのPC間でメッセージを送信するためにTcp接続に取り組んでいますが、コンソールアプリケーションの場合はうまく動作しますが、Windowsフォームではリスナーは停止します。TCPリスナーがWindowsフォームでリッスンを停止する
例外:
Not listening. you must call the start() method before calling this method.
はここに私のコードです。
コード:
public static void TcpListener()
{
TcpListener server = null;
try
{
// Set the TcpListener on port 13000.
Int32 port = 8888;
IPAddress localAddr = IPAddress.Parse(Getlocalip());
// TcpListener server = new TcpListener(port);
server = new TcpListener(localAddr, port);
// Start listening for client requests.
server.Start();
// Buffer for reading data
Byte[] bytes = new Byte[256];
String data = null;
// Enter the listening loop.
Thread t = new Thread(() =>
{
while (true)
{
MessageBox.Show("Waiting for a connection... ");
// Perform a blocking call to accept requests.
// You could also user server.AcceptSocket() here.
TcpClient client = server.AcceptTcpClient();
MessageBox.Show("Server Connected!");
data = null;
// Get a stream object for reading and writing
NetworkStream stream = client.GetStream();
int i;
// Loop to receive all the data sent by the client.
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
// Translate data bytes to a ASCII string.
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
// Console.WriteLine("Received: {0}", data);
if (data == "pbrush")
{
Runprocess("start " + data);
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data + " opened successfully");
// Send back a response.
stream.Write(msg, 0, msg.Length);
}
if (data == "calc")
{
Runprocess("start " + data);
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data + " opened successfully");
// Send back a response.
stream.Write(msg, 0, msg.Length);
}
if (data.ToString() == "getmac")
{
string result = Runprocess(data, true);
byte[] msg = System.Text.Encoding.ASCII.GetBytes(result);
// Send back a response.
stream.Write(msg, 0, msg.Length);
}
if (data.ToString() == "tree d:")
{
string result = Runprocess(data, true);
byte[] msg = System.Text.Encoding.ASCII.GetBytes(result);
// Send back a response.
stream.Write(msg, 0, msg.Length);
}
if (data.ToString() == "ipconfig")
{
string result = Runprocess(data, true);
byte[] msg = System.Text.Encoding.ASCII.GetBytes(result);
// Send back a response.
stream.Write(msg, 0, msg.Length);
}
if (data.ToString() == "facebook")
{
Runprocess("start " + data);
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data + " opened successfully");
// Send back a response.
stream.Write(msg, 0, msg.Length);
}
// Process the data sent by the client.
data = data.ToUpper();
Console.WriteLine("Sent");
}
// Shutdown and end connection
client.Close();
}
});
t.IsBackground = true;
t.Start();
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
finally
{
// Stop listening for new clients.
server.Stop();
}
Console.WriteLine("\nHit enter to continue...");
Console.Read();
}
スレッド内にtry catchを追加した後、この例外が発生しました。ブロック操作がWSACancelblockingCallの呼び出しによってインターラプトされました。 – DumpsterDiver
これはOKです。つまり、あなたが 'server.Stop()'を呼び出している間に 'server.AcceptTcpClient()'で待っていたことを意味します。 –
**サーバを停止する前に**キーを待っていることを確認してください。 –