我被要求创建一个TCPListener控制台应用程序来监视特定端口中的传入数据。我已经搜索了一段时间,我有以下代码,我通过LINQPad运行:
void Main()
{
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
Console.WriteLine("Starting TCP listener...");
TcpListener listener = new TcpListener(ipAddress, 1005);
try
{
listener.Start();
while (true)
{
Socket client = listener.AcceptSocket();
client.ReceiveTimeout.Dump();
Console.WriteLine("Connection accepted.");
var childSocketThread = new Thread(() =>
{
Byte[] bytes = new Byte[256];
String data = null;
int i;
while((i = client.Receive(bytes))!=0 && data != "55AA")
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
}
Console.WriteLine("connection closing");
client.Close();
//throw new Exception();
});
childSocketThread.Start();
}
listener.Stop();
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.StackTrace);
Console.ReadLine();
}
}
这实际上是对Google中数百万个示例的略微修改的代码。我的问题是在LINQPad中我通常按下运行按钮,然后打开一个命令提示符并远程登录到127.0.0.1
端口1005,然后我写了一些好东西。
如果我按下LINQPad中的停止按钮然后再次按“运行”,我最终会出现以下错误:
错误:在System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot,SocketAddress socketAddress) 在System.Net.Sockets.Socket.Bind(EndPoint localEP) 在System.Net.Sockets.TcpListener.Start(Int32 backlog) 在System.Net.Sockets.TcpListener.Start() 在c:\ Users \ giannis \ AppData \ Local \ Temp \ LINQPad_jncifzyi \ query_lgowqr.cs中的UserQuery.Main():第40行
现在,我知道您可能只有一个客户端listening
或using
一个特定的端口,但我的问题是,在进入实际解决方案之前,首先我要使用LINQPad。我知道我可以使TCPListener变量成为全局变量并在退出程序时处理它。但是,如果它崩溃或什么呢?在注销登录之前,我最终还是无法连接到端口吗?
答案 0 :(得分:1)
在LINQPad中重启程序时,GC可能没有清理监听器。在实际程序中,当进程退出时,将清除所有TCP端口。重新启动LINQPad,您将再次找到该端口的空闲状态。
我不明白为什么在快速测试代码时使用Visual Studio项目会更加繁重。只需按F5。但是,转储功能不存在。
答案 1 :(得分:0)
正确清理TcpListener非常重要,但您可以在Try语句之前添加它:listener.ExclusiveAddressUse = false;
答案 2 :(得分:0)
我的问题是,LINQPad在取消后继续运行进程。
使用"取消所有主题并重置"菜单选项(ctrl + shift + F5)或手动终止所有" LINQPad.UserQuery.exe"任务管理器中的进程。
该端口应该再次免费。