C# TCPListener阻止新连接
我被要求创建一个TCPListener控制台应用程序来监控特定端口中的传入数据。我已经搜索了一段时间,我通过LINQPad运行了以下代码:C# TCPListener阻止新连接,c#,sockets,tcplistener,C#,Sockets,Tcplistener,我被要求创建一个TCPListener控制台应用程序来监控特定端口中的传入数据。我已经搜索了一段时间,我通过LINQPad运行了以下代码: void Main() { IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); Console.WriteLine("Starting TCP listener..."); TcpListener listener = new TcpListener(ipAddress, 100
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();
}
}
这实际上是谷歌上百万个示例的一段稍加修改的代码。我的问题是,在LINQPad中,我通常会按下run按钮,然后打开命令提示符,并将telnet连接到127.0.0.1
Port1005,然后我会写一些很好的东西
如果我按下LINQPad中的停止按钮,然后再次按下Run,则会出现以下错误:
错误:位于System.Net.Sockets.Socket.DoBind(端点端点快照,SocketAddress SocketAddress)
位于System.Net.Sockets.Socket.Bind(端点localEP)
在System.Net.Sockets.TcpListener.Start(Int32积压工作)中
在System.Net.Sockets.TcpListener.Start()中
在c:\Users\giannis\AppData\Local\Temp\LINQPad\u jncifzyi\query\u lgowqr.cs中的UserQuery.Main()处:第40行
现在,我了解到您可能只有一个客户机
在侦听
或使用
特定端口,但我的问题是,首先,在使用实际解决方案之前,我想使用LINQPad。我知道我可以将TCPListener变量设置为全局变量,并在退出程序时处理它。但是如果它崩溃了或者什么的呢?在注销登录之前,我是否将无法连接到端口?可能是,当您在LINQPad中重新启动程序时,GC尚未清理侦听器。在实际的程序中,当进程退出时,所有TCP端口都会被清除。重新启动LINQPad,您将发现端口再次可用
我不明白为什么在快速测试代码时,使用VisualStudio项目会变得更加繁重。只需按F5。不过,转储函数不存在。正确清理TcpListener很重要,但您可以在Try语句之前添加它:listener.ExclusiveAddressUse=false 参考:
我的问题是,在取消进程后,LINQPad会保持进程运行 使用“取消所有线程并重置”菜单选项(ctrl+shift+F5)或手动终止任务管理器中的所有“LINQPad.UserQuery.exe”进程
该端口应该又是免费的。老实说,在这里等待答复时,我确实做到了,并启动了一个项目,似乎一切都正常:-)。但通常当我只想玩游戏而不想马上开始开发时,LINQPad是我的朋友。但可能不是这样。我也只是检查了一下,实际上我不需要为了停止侦听器而处理应用程序的关闭。无论如何,您应该使用将资源包装在
中。我想这也会拯救你。我试过了,但TCPListener似乎没有实现IDisposable,所以使用似乎是不可能的,我将此标记为一个答案,因为我似乎不应该使用LINQPad来实现这一点,而vs的应对能力相当不错。谢谢你抽出时间。