Tag: tcp

什么是消息边界?

什么是“消息bonudaries”在以下背景下? TCP和UDP之间的一个区别是UDP保留了消息边界。 我理解TCP和UDP之间的区别,但不确定“消息边界”的定义。 由于UDP包含每个数据包中的目的地和端口信息,是否可以为消息提供“边界” ?

如何检查远程IP和端口?

我必须检查远程IP和端口是否可用。如果它可用,它将移动到下一个表单。如果不可用,它应该进入初始状态。我试过使用这个 while (true) { IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners(); ——- ——- ——- } 我正在显示示例coding.it正在检查本地IP和端口并转移到下一个form.it将检查本地端口和IP是否可用。如果端口和IP不可用它将进入初始阶段并且它工作正常。我必须检查远程端口和IP。

连接后如何测试TCPClient连接断开?

我一直在争论一个问题整整3天我找不​​到任何解决方案,请帮忙:) 我使用Visual Studio 2010和C#语言。 我有一台像服务器一样工作的设备,它在非常不规则的时间段内发送一些数据(不可能定义任何读取超时)。 我写了一个TCP客户端来连接到该服务器并读取数据。 它工作正常,但是当网络出现问题并且服务器变得不可用时(例如,当我从计算机插入网络电缆时),应用程序需要大约10秒才能“注意到”没有连接到服务器并抛出例外。 (我不知道为什么到了10秒?它定义在哪里?我能改变吗?) 我希望反应更快 – 在连接断开后一秒钟之后说。 然而谷歌搜索答案并没有为我提供任何有效的解决方案。 测试代码如下,我尝试在2个线程上进行:一个是读取数据,第二个是查找连接状态,当它被破坏时应该报警。 它既不适用于TCPClient也不适用于Socket类。 我试图用tcpClient.SendTimeout = 100;读/写一些数据tcpClient.SendTimeout = 100; 和stream.WriteTimeout = 100; 但它似乎没有用。 using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Threading; namespace TCPClient { class Program { static volatile bool _continue = true; static TcpClient tcpClient; static NetworkStream stream; […]

c#套接字处理多个客户端

我有以下代码,我想将其作为我的服务器实现。 据我所知它是异步的。 并应允许来自多个客户的连接…… public void Start() { TcpListener listener = new TcpListener(IPAddress.Any, 10250); listener.Start(); Console.WriteLine(“Listening…”); while (true) { IAsyncResult res = listener.BeginAcceptTcpClient(HandleAsyncConnection, listener); connectionWaitHandle.WaitOne(); } } private void HandleAsyncConnection(IAsyncResult res) { TcpListener listener = (TcpListener)res.AsyncState; TcpClient client = listener.EndAcceptTcpClient(res); connectionWaitHandle.Set(); StringBuilder sb = new StringBuilder(); var data = new byte[client.ReceiveBufferSize]; using (NetworkStream ns = client.GetStream()) […]

TCP消息损坏

我有一个简单的TCP服务器,通过GPRS与一些设备通信。 它长时间正常工作没有任何问题。 现在,设备(客户端设备,发送数据)发生了变化,并且它们发送的数据比以前多得多,TCP消息大小可能比之前大10倍。 早先它是最大1024字节/数据消息,现在它可以超过1万字节/消息。 正如我所看到的 – 正如TCP所预测的那样 – 有许多消息被“破坏”,所以不是完整的消息,只有一部分到达,后来可以到另一部分等。 我认为我的服务器 – 基于异步模式 – 以错误的方式处理这种情况,我认为该错误在我的RecieveCallBack函数中。 我找不到正确处理这种情况的方法。 我怎样才能做到这一点? 这是我的RecieveCallBackfunction: public void RecieveCallBack(IAsyncResult ar) { StateObject state = (StateObject)ar.AsyncState; try { Socket handler = state.WorkSocket; int read = handler.EndReceive(ar); if (read > 0) { var data = new byte[read]; Array.Copy(state.Buffer, 0, data, 0, read); } else { if […]

获取NetworkStream中可用的数据长度

我希望能够从C#中的TCP网络流中获取可用数据的长度,以便在从网络流中读取之前设置缓冲区的大小。 有一个NetworkStream.Length属性但它尚未实现,我不想为缓冲区分配一个巨大的大小,因为它会占用太多空间。 我做这件事的唯一方法是在数据传输之前与另一个告诉大小,但这似乎有点混乱。 这对我来说最好的方法是什么。

异步TCP服务器 – 消息框架建议

我在C#中有一个异步TCP套接字服务器,我使用Tocket的TcpListener / TcpClient包装器。 我对网络一般都很陌生,所以我不知道TCP如何处理发送的数据,以及它如何不保留消息边界。 经过一番研究后,我想我已经提出了一个可靠的解决方案,但我想知道是否有人对我有更多建议。 目前,我发送的数据是使用protobuf(Google的数据交换库)的序列化类对象的byte [] https://code.google.com/p/protobuf/ 在我序列化数据之后,在它发送之前,我决定在字节数组的开头附加一个4字节的Int32。 我的想法是,当数据包被发送到服务器时,它将解析出Int32,然后等到它接收到该数量的字节数,然后再对数据做任何事情,否则再次调用BeginRead。 这是我编写数据之前运行的代码,它似乎工作正常,但我对任何性能建议持开放态度: public byte[] PackByteArrayForSending(byte[] data) { // [0-3] Packet Length // [3-*] original data // Get Int32 of the packet length byte[] packetLength = BitConverter.GetBytes(data.Length); // Allocate a new byte[] destination array the size of the original data length plus the packet length array size […]

TCP客户端\服务器 – 客户端并不总是读取

客户代码: TcpClient client = new TcpClient(); NetworkStream ns; private void Form1_Load(object sender, EventArgs e) { try { client.Connect(“127.0.0.1”, 560); ns = client.GetStream(); byte[] buffer = ReadFully(ns, client.Available); //working with the buffer… } catch { //displaying error… } } public static byte[] ReadFully(NetworkStream stream , int initialLength) { // If we’ve been passed an unhelpful initial […]

KeepAlive与WCF和TCP?

我有一个Windows服务托管高级WCF服务,通过TCP(netTCP)与protobuf.net进行通信,有时也使用证书。 receiveTimeout设置为无限,永不丢弃由于不活动而导致的连接。 但从我的理解,无论如何都可以删除连接,所以我创建了一个简单的双向keepalive服务方法,客户端每9分钟调用一次以保持连接活动。 连接永远不会中断是非常重要的。 这是正确的方法吗? 或者我可以简单地删除我的保持,因为receiveTimout设置为无限? 编辑:WCF服务的当前app.config: http : //1drv.ms/1uEVKIt

通过Internet保持活动的TCP / IP连接套接字 – 什么时候? 怎么样? 多少钱?

更新:如果你想节省冗长的序言,请跳至答案。 TCP / IP连接KeepAlives至少每两个小时指定一次: http : //tools.ietf.org/html/rfc1122#page-101 。 问题是这是写于1989年,并担心发送额外的KeepAlive数据包的成本! 然而,仍然是默认时间,大多数操作系统根据规范在一段时间不活动后将KeepAlives发送到连接的套接字! 当然,现在大多数连接在此之前超时,如果不活动,并且如果通过Internet连接连接到对等设备之前没有你的知识方式(尽管设置的超时高于那个 – 我怀疑因为中间的路由器表不打扰保持它还活着 – 我总是想知道泄漏的最后一条消息在哪里… 更新:原因是可能在您或远程主机端的’路由器’是’有状态’并且连接感知并在一段时间之后断开连接不活动的时间 – 你通过互联网的路由器不能放弃你的连接 – 他们不关心 – 数据包只是发送到必须去的地方)。 所以我看到了两种常见的解决方案来保持互联网上的连接: 1)无视( 编辑:已经向我指出这不是无视规范它只是改变默认值)规范并将系统范围的KeepAlive间隔改为低于2小时,或2)实现自己的’KeepAlive’系统定期轮询对等体。 无论哪种方式; 什么是合适的时间段(发送KeepAlive的不活动时间)? 我已经看到从1秒到默认2小时的所有内容。 似乎这个数字是用拇指吸出的……如果我有一个客户端应用程序从世界上任何地方连接什么是安全合理的时期(我想要一个持久的连接)? 通过互联网连接到世界另一端的同伴很多跳,连接在301秒后死亡(虽然你在尝试发送东西时只知道它)所以将周期设置为300秒似乎是神奇的数字 – 我在死亡前获得了KeepAlive 1秒钟 – 这段时间从来没有让我失望过..但是它安全吗? 编辑:这个特殊的连接我实现在C#3.0所以代码在欢迎。