Tag: sockets

我怎样才能强行关闭TcpListener

我有一个通过tcpListener进行通信的服务。 问题是当用户重新启动服务时 – 抛出“正在使用的地址”exception,并且服务无法在几分钟左右启动。 是否有任何方法告诉系统终止旧连接,以便我可以打开一个新连接? (我不能只使用随机端口,因为服务无法通知客户端端口是什么,所以我们必须依赖于预定义的端口)

如果没有数据发送,TCP套接字会在一段时间后自动关闭吗?

我有一个客户端服务器的情况,客户端打开到服务器的TCP套接字,有时很长一段时间将通过它们之间没有数据发送。 我遇到了一个问题,服务器试图将数据发送到客户端,它似乎成功,但客户端从未收到它,几分钟后,它看起来像客户端断开连接。 我是否需要每隔一段时间发送一些保持活动包? 编辑 :要注意,这是在同一台计算机上的同行。 计算机位于NAT后面,可以转发用于此计算机的一系列端口。 与服务器连接的客户端通过DNS打开连接。 即它使用mydomain.net和端口进行连接。

要关闭套接字,请不要关闭()套接字。 Uhmm?

我知道TIME_WAIT是TCP / IP的一个组成部分,但是在SO(和其他地方)有很多问题,每秒创建多个套接字,服务器最终耗尽短暂的端口。 我发现当使用TCPClient (或Socket )时,如果我调用Close()或Dispose()方法,套接字的TCP状态将更改为TIME_WAIT,并将在完全关闭之前遵循超时时间。 但是,如果它只是将变量设置为null则套接字将在下一次GC运行时完全关闭,这当然可以强制执行,而不会经历TIME_WAIT状态。 这对我来说没有多大意义,因为这是一个IDisposable对象,不应该GC也调用对象的Dispose()方法? 这是一些PowerShell代码,演示了(在这台机器上没有安装VS)。 我使用来自Sysinternals的TCPView实时检查套接字状态: $sockets = @() 0..100 | % { $sockets += New-Object System.Net.Sockets.TcpClient $sockets[$_].Connect(‘localhost’, 80) } Start-Sleep -Seconds 10 $sockets = $null [GC]::Collect() 使用此方法,套接字永远不会进入TIME_WAIT状态。 如果我在手动调用Close()或Dispose()之前Close()应用程序,则相同 有人可以解释一下这是否是一个好的做法(我想人们会说这不是)。 编辑 GC已经回答了这个问题,但我仍然有兴趣找出为什么这会对套接字状态产生任何影响,因为这应该由操作系统控制,而不是.NET。 还有兴趣了解使用此方法来防止TIME_WAIT状态并最终是否是某个地方的错误(即,所有套接字是否应该通过TIME_WAIT状态?)是否是一个好习惯?

.net中的TLS / SSL

是否有任何(希望是免费/开源)代码可以进行本机TLS / SSL通信? 我不谈论HTTPListener / Client和WebRequest类。 我想在我的C#代码中进行原始TLS通信。 提前谢谢,马克斯

TcpListener:如何在等待AcceptTcpClientAsync()时停止侦听?

我不知道如何在异步方法等待传入连接时正确关闭TcpListener。 我在SO上找到了这个代码,这里是代码: public class Server { private TcpListener _Server; private bool _Active; public Server() { _Server = new TcpListener(IPAddress.Any, 5555); } public async void StartListening() { _Active = true; _Server.Start(); await AcceptConnections(); } public void StopListening() { _Active = false; _Server.Stop(); } private async Task AcceptConnections() { while (_Active) { var client = await _Server.AcceptTcpClientAsync(); […]

通常只允许使用每个套接字地址(协议/网络地址/端口)?

我一直在谷歌寻找一个严肃的解决方案,我只得到“Regisrty解决方案”的东西,我不认为甚至与我的问题有关。 由于某种原因,我得到这个错误,而我只启动一次TcpListner,当+如果失败我停止服务器。 我真的不明白。 这是我的代码: class Program { private static string ServerName = “”; private static string UserName = “”; private static string Password = “”; private static string dbConnectionSring = “”; private static X509Certificate adminCertificate; private static byte[] readBuffer = new byte[4096]; static void Main(string[] args) { Console.WriteLine(“Please grant SQL Server access to the Admin […]

Tcp可靠性与Udp负载对于认真,高性能的服务器

速度,优化和可扩展性是Udp和Tcp协议之间的典型比较。 Tcp吹嘘可靠性有一点额外开销的缺点,但速度很好,非常好。 一旦Tcp套接字被实例化,保持套接字打开需要一些开销。 但与Udp所描述的负担相比,哪种协议实际上有更多的开销? 我也听说过Tcp存在可扩展性问题……但是互联网(网页/服务器)在Tcp上运行 – 那么Tcp是什么阻碍了可扩展性呢? 好的…所以Udp不需要保持连接打开的开销。 但是,它要求您编写额外的方法以确保所有数据包都到达那里,希望按照您希望它接收的顺序。 如果未完整收到数据包,则必须告知客户端或服务器重新发送。 此外,您还必须为部分数据包保留某种消息收集,重建部分消息,并在最终处理消息之前检查完整的消息。 更不用说如果消息的第二部分永远不会成功,你必须要么重新发送整个事物,要么重新发送我们缺少的部分,或者其他什么。 基本上,我的问题是: 为什么我会选择Udp over Tcp来获得一个严肃的高性能服务器,它增加了消息检查和手动ACK的“开销”与连续流的“开销”? 如果Tcp对于魔兽世界来说足够好,为什么Tcp不被广泛接受作为游戏服务器使用的协议? 注意:我不反对为服务器实现Udp选项。 我们在.Net 3.5框架上使用C#。 因此,我也对处理Udp 负担的最佳实践感兴趣。 我也在套接字级别使用异步方法,而不是使用TcpListener,TcpClient等。

如何使用C#4.0编写可伸缩的套接字服务器?

我想编写一个简单的套接字服务器,但是我希望它可以垂直扩展,例如,不是每个连接创建一个线程,也不是很长时间运行的任务,这可能会占用所有线程。 服务器接收包含查询的请求并流式传输任意大的结果。 我希望使用C#4中提供的技术和库来实现这一点的惯用方法,重点是简单的代码,而不是原始性能。 重新打开套接字服务器是可伸缩系统的有用部分。 如果要水平缩放,则有不同的技术。 如果您从未创建套接字服务器,则应该无法回答此问题。

TCP从客户端和服务器读取和写入

我正在尝试创建一个可以在彼此之间来回读写信息的客户端和服务器。 我可以从客户端和服务器写入读取但不反之亦然,我不知道为什么。 这里似乎没有人知道我之前问过什么,而且我无法在网上找到任何有用的东西。 如果您知道请告诉我,不要告诉我去阅读有关TCP的文章,因为它根本没有用。 客户: namespace ExampleClient { public partial class Form1 : Form { public static bool IsConnected; public static NetworkStream Writer; public static NetworkStream Receiver; public Form1() { InitializeComponent(); } private void BtnConnect_Click(object sender, EventArgs e) { TcpClient Connector = new TcpClient(); Connector.Connect(TxtIP.Text, Convert.ToInt32(TxtPort.Text)); IsConnected = true; Writer = Connector.GetStream(); Console.WriteLine(“Connected”); System.Threading.Thread Rec […]

通过套接字最简单的广告/听力安排

以下简单安排有什么问题。 我所做的就是创建一个多播消息的UDP广告商,以及一个加入多播组以接收此消息的侦听器,两者都在同一台机器上运行。 string Port = “54153”; HostName Host = new HostName(“224.3.0.5”); //a multicast range address //listener var L = new DatagramSocket(); L.MessageReceived += (sender2, args) => { /*something*/ }; await L.BindServiceNameAsync(Port); L.JoinMulticastGroup(Host); //advertiser var AdvertiserSocket = new DatagramSocket(); AdvertiserSocket.Control.MulticastOnly = true; Stream outStream = (await AdvertiserSocket.GetOutputStreamAsync(Host, Port)).AsStreamForWrite(); using (var writer = new StreamWriter(outStream)) { await […]