Tag: tcp

直到什么时候NetworkStream.Write阻止?

我能想到这些可能的答案: 直到数据被写入IP堆栈中的某个内部缓冲区。 直到数据通过电线发送。 直到从其他机器收到确认接收为止。

在异步读取期间TcpClient断开连接

我有一些关于完成tcp连接的问题。 在使用listener.BeginAcceptTcpClient(ConnectionEstabilishedCallback, null);接受客户端后,客户端使用Tcp连接到我的服务器.BeginAcceptTcpClient listener.BeginAcceptTcpClient(ConnectionEstabilishedCallback, null); ,我开始用networkStream.BeginRead(….)阅读。 当我等待消息时客户端断开连接会发生什么? (例如,它失去了电力,互联网等) 我怎么知道它什么时候发生? 如果成功读取后,我会做一些事情,然后调用networkStream.Close(); client.Close(); networkStream.Close(); client.Close(); 客户会看到什么? 如何“优雅地”终止连接? 如果我正在等待读取(使用BeginRead),然后(在不同的线程上)关闭相同的流会发生什么? 编辑添加:我确实在客户端和服务器之间发生了乒乓消息。 够了吗? 如果我没有收到ping,请终止我的NetworkStream? 肯定有一些更好的东西。

wcf“关闭客户端后,远程主机强行关闭现有连接”

关闭客户端程序后,我收到错误“远程主机强行关闭现有连接”。 我添加了此代码以确保在程序关闭时关闭客户端连接。 我还有一个关闭客户端的按钮,按钮工作没有错误。 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { try { client.Close(); } catch (CommunicationException ex) { client.Abort(); } catch (TimeoutException ex) { client.Abort(); } catch (Exception ex) { client.Abort(); throw ex; } } 我在这里想念一下吗? 这是堆栈跟踪: bei System.ServiceModel.Channels.SocketConnection.HandleReceiveAsyncCompleted() bei System.ServiceModel.Channels.SocketConnection.OnReceiveAsync(Object sender, SocketAsyncEventArgs eventArgs) bei System.ServiceModel.Channels.SocketConnection.OnReceiveAsyncCompleted(Object sender, SocketAsyncEventArgs e) bei System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(SocketAsyncEventArgs e) bei System.Net.Sockets.SocketAsyncEventArgs.FinishOperationAsyncFailure(SocketError socketError, […]

检测客户端的正确方法已从TCP / IP断开连接

我使用了异步TCP / IP服务器,一切正常,但是当客户端由于错误或强制退出应用程序而断开连接时,由于IO.IOException类型的exception,它也会关闭我的服务器。 以下子发生exception: Private Sub ReadCallback(ByVal result As IAsyncResult) Try Dim client As Client = TryCast(result.AsyncState, Client) If client Is Nothing Then Return End If ‘MsgBox(client.ClientID) Dim networkStream As NetworkStream = client.NetworkStream Dim read As Integer = networkStream.EndRead(result) **’ ERRORS HERE!** If read = 0 Then Dim client As Client = TryCast(result.AsyncState, Client) SyncLock […]

检测关闭的网络连接

我写过一些通过TCP进行通信的小程序。 由于一个程序已关闭其网络连接,而另一个端点以某种方式未能注意到它现在已断开连接,因此系统挂起时存在无穷无尽的问题。 我期待在已关闭的TCP连接上进行I / O以抛出某种I / Oexception,但是程序似乎只是挂起 ,等待另一个端点回复。 显然,如果连接已关闭,则该回复永远不会到来。 (如果你把它留下来,比如20分钟,它似乎没有超时。) 有什么方法可以强制远程端“看到”我已关闭网络连接? 更新:这是一些代码…… public sealed class Client { public void Connect(IPAddress target) { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(ipAddress, 1177); _stream = new NetworkStream(socket); } public void Disconnect() { _stream.Close(); } } public sealed class Server { public void Listen() { var listener = […]

我怎样才能强行关闭TcpListener

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

微软异步服务器套接字示例

我有一个关于这个问题的问题(“异步服务器套接字多个客户端”)。 要么微软改变了这个例子,因为Groos回答或者我真的没有得到它 – 在示例中它说: while (true) { // Set the event to nonsignaled state. allDone.Reset(); // Start an asynchronous socket to listen for connections. Console.WriteLine(“Waiting for a connection…”); listener.BeginAccept( new AsyncCallback(AcceptCallback), listener ); // Wait until a connection is made before continuing. allDone.WaitOne(); } 据我所知,在while(true)循环中连续调用BeginAccept()函数,只有在调用AcceptCallback()函数时才会被调用,因为首先发生的是allDone.Set()。 但格罗说 MSDN示例的问题在于它只允许连接单个客户端(listener.BeginAccept只调用一次)。 实际上我不明白为什么使用ManualResetEvent allDone …而且我认为listener.EndAccept(ar)方法无论如何都是阻塞的。 listener.BeginAccept()是否在仍然运行时第二次调用时抛出exception? 但是,如果是这样,为什么allDone.Set()在listener.EndAccept(ar)之前呢? 还有一个问题: 在收到EOF后,我可以在ReadCallback(IAsyncResult ar)函数中调用handler.BeginReceive(…)来等待来自同一客户端的更多数据吗? […]

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

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

你如何在C#中获得原始TCP数据包?

我想收到原始TCP数据包,然后以相同的工作负载发送回来。 它应该看起来像这样: void OnPacketReceived(TcpPacket p) { byte [] body = p.GetBody(); } 注意:我需要TCP数据包而不是以太网帧。

如何阻止异步tcp .NET代码耗尽整个系统的资源

在我的一些异步tcp服务器代码中,偶尔会发生错误,导致进程占用整个系统的内存。 在查看日志,事件查看器和一些MS文档时,如果“调用应用程序多次向同一客户端调用异步IO,那么如果远程客户端停止其结束,您可能会看到堆碎片和私有字节增加” / O“导致内存使用量激增以及System.Threading.OverlappedData结构和字节数组的固定。 知识库文章提出的解决方案是“设置未完成缓冲区(发送或接收)与其异步IO的上限。” 怎么做到这一点? 这是指发送到BeginRead的byte []吗? 那么解决方案只是用信号量包装访问byte []? 编辑:信号量控制访问字节缓冲区或只是具有静态大小的字节缓冲池是两种常见的解决方案。 我仍然存在的一个问题是,当这个异步客户端问题发生时(实际上它可能是一些奇怪的网络事件)有信号量或字节缓冲池将阻止我耗尽内存,但它无法解决问题。 我的缓冲池可能会被问题客户端吞噬,实际上锁定了正确的函数合法客户端。 编辑2:遇到了这个伟大的答案 。 基本上它显示了如何手动取消固定对象。 虽然异步TCP代码可以固定到幕后运行时规则,但是可以通过在使用前明确地固定每个缓冲区来覆盖它,然后在块的末尾或者在finally中取消固定。 我现在想弄明白……