我有一个服务器应用程序.我也有一个客户端应用程序.当两个应用程序碰巧在同一网络上时,我能够在应用程序之间建立tcp连接.因此,假设运行服务器应用程序的计算机正在侦听端口2121上的新连接,并且它具有LAN IP地址192.168.0.120.在运行客户端应用程序的另一台计算机上,我将能够通过提供端口号2121和IP地址192.168.0.120来建立连接.
有没有办法找到网络上正在侦听端口2121的所有计算机?
我现在想的一个算法是:
获取当前计算机的IP地址,并说它出现为192.168.0.145.
现在很可能服务器将侦听IP地址192.168.0.
然后在端口2121上ping 192.168.0.1,在端口2121上ping 192.168.0.2 ...然后继续.
我不知道这种方法是否有效.此外,服务器可能正在侦听IP地址192.168.1.x
那么我必须对我的服务器和客户端应用程序进行哪些更改,以便客户端能够找到侦听端口2121的所有服务器?
我一直在阅读有关如何检查 LAN 上特定端口上的所有侦听服务器的信息,最后我编写了一些代码,它可以按我想要的方式工作。
我正在使用 System.Threading.Tasks.Parallel 尽快连接到所有 254 个 IP 地址,例如
:192.168.1。1 - 192.168.1。第254章
我需要的是为这些连接尝试设置超时,因为失败时需要大约 15-20 秒才能打印:“连接失败”..那么我该怎么做?
这是客户端代码:
static void Main(string[] args)
{
Console.WriteLine("Connecting to IP addresses has started. \n");
Parallel.For(1, 255, i =>
{
Connect("192.168.1." + i);
});
Console.ReadLine();
}
private static void Connect(string ipAdd)
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse(ipAdd), 9990);
e.RemoteEndPoint = ipEnd;
e.UserToken = s;
e.Completed += new EventHandler<SocketAsyncEventArgs>(e_Completed);
Console.WriteLine("Trying to connect …Run Code Online (Sandbox Code Playgroud) 我有一个文件传输应用程序在FTP服务器之间移动文件.任何时候我们都可以在移动中拥有数十个文件.为了防止泛滥FTP服务器,我有一个监视器和信号量锁系统.
我的FTP客户端经常根据调用堆栈冻结在System.Net.Sockets.Socket.Receive()内的某个地方.我没有得到例外,所以无法解决问题.我想取消该线程,因为它阻止了其他想要使用FTP客户端的线程.
我已经考虑启动最终在新线程中调用System.Net.Sockets.Socket.Receive()并在一段时间后中止线程的方法,但我担心在线程中止后套接字将保持打开状态.在没有响应的线程之后,有更优雅的方法来杀死和清理吗?
是否可以AcceptSocket在TcpListener超时的对象上进行一次中断?
TcpListener server = new TcpListener(localIP, port);
server.Start();
while (!shuttingDown)
try
{
Socket client = server.AcceptSocket();
if (client != null)
{
// do client stuff
}
}
catch { }
Run Code Online (Sandbox Code Playgroud)
尝试 BeginAccept 和 EndAccept:如果 3 秒内没有客户端,我该如何结束接受?(我试图在这里近似解决方案)
server.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClientCallback), server);
Thread.Sleep(3000);
server.EndAcceptTcpClient(???);
Run Code Online (Sandbox Code Playgroud) 到目前为止,我发现的所有解决方案都基于WaitOne: 如何配置套接字连接超时 或生成工作线程
对我来说,用阻塞线程会WaitOne破坏异步方法的目的。生成另一个线程并不会好得多(因为异步模型会努力使用尽可能少的线程)。
还有其他解决方案仍然可以让我放弃连接尝试而不会阻塞当前线程或产生另一个线程吗?
我正在开发一个由外部代码使用的库,该库不知道我的库内部发生了什么(代码只调用了我的ConnectAsync方法,其余的工作TcpClient.ConnectAsync依此类推)。外部代码可以是任何内容(Web应用程序,桌面应用程序,Windows服务等)。理想情况下,除了设置类的.Timeout属性之外,该解决方案不应要求外部代码执行任何操作来终止操作。但是,如果这是实现自定义连接超时时避免块或工作线程的唯一方法,我将不胜感激,看看我有哪些选项(就异步/等待模型而言)。