Tag: tcp

TcpClient的NetworkStream何时完成一次读操作?

我正在开发一个涉及通过TCP和Google协议缓冲区进行客户端服务器通信的项目。 在客户端,我基本上使用NetworkStream.Read()通过字节数组缓冲区从服务器进行阻塞读取。 根据MSDN文档, 此方法将数据读入buffer参数并返回成功读取的字节数。 如果没有可用于读取的数据,则Read方法返回0. Read操作读取尽可能多的数据,最多为size参数指定的字节数。 如果远程主机关闭连接,并且已收到所有可用数据,则Read方法立即完成并返回零字节。 与异步读取(NetworkStream.BeginRead和EndRead)的情况相同。 我的问题是Read()/ EndRead()何时返回? 看起来它会在填充缓冲区中的所有字节后返回。 但在我自己的测试中,情况并非如此。 在一次操作中读取的字节变化很大。 我认为这是有道理的,因为如果在发送消息时服务器端有暂停,客户端不应该等到读取缓冲区已经填满。 Read()/ EndRead()本身是否有一些超时机制? 我试图找出Mono如何在NetworkStream中实现Read()并跟踪,直到调用extern方法Receive_internal()。

.net Tcp Server每隔几分钟就会收到大块的字节

背景: C#.net同步Tcp服务器 通过使用AcceptTcpClient方法阻塞TcpListener来分配TcpClient对象 一旦有了一个TcpClient对象,我将它传递给一个线程,该线程调用客户端的GetStream方法来创建一个NetworkStream 这个NetworkStream循环,在每次迭代中做一个networkStream.Read(someBuffer,0,4096) 现在客户端和服务器位于同一网络上,没有拥塞可言 我的服务器有足够的内存空间 如果我将我的服务器软件加载到另一台机器上,问题就会消失 踢球者: 来自网络Linux盒子的流量可以准时到达 我的服务器已经好几个月了。 但是,在过去的周末中,不是快速连续接收小组字节,而是每隔几分钟就会发生进程开始的地方(tcpListener.AcceptTcpClient())。 所以我的服务器处于空闲状态,然后将30-50个客户端请求全部捆绑到一个巨大的字节块中。 毋庸置疑,这会导致巨大的延迟,并对我的服务器造成压力。 如果客户端请求的数量足够大,我的服务器可能需要30分钟才能赶上。 在我的客户端内置的日志记录中,我可以看到它们进行网络写入,并在每个写入之间进行刷新。 所以客户端运行正常。 某种系统干预的这种意外。 我的Tcp服务器(如上所述)是坏的,还是Windows中的某些东西干扰了我的流量,我该怎么说? 多谢你们。

C#字节流通过TCP

我是一名小工程师,希望能在这里找到所有有经验的人提出的建议。 我被分配了一个项目来创建一个通过TCP进行字节流的服务器/客户端应用程序。 我们公司通过GPS和调度软件处理带有GPS的双向无线电,我们希望用它来制作服务器/客户端应用程序。 目前,调度软件可以连接到用户必须在的中央基站,但我们希望从远程位置访问该软件(如果基站距离调度员可以在几英里外的中继站) )。 用户/客户端 – >轮询麦克风的位置 – >服务器 – >基站 – > OTA信号 – >无线电和返回 我一直在关注Windows Communication Foundation,但有什么其他方法可以解决这个问题? 我将主要使用C#/ .NET / Visual Studio 2008

TCP / IP消息帧

我已经建立了一个TCP / IP服务器/客户端,它是异步的,但它连接了消息。 我如何正确地在开始时添加标题,然后在最后使用字符串构建器来取消连接完整的消息。 服务器阅读消息: Private Sub ReadCallback(ByVal result As IAsyncResult) Try allDone.Set() Dim success As Boolean = result.AsyncWaitHandle.WaitOne(500, True) If success Then Dim client As ServerClient = TryCast(result.AsyncState, ServerClient) If client Is Nothing Then Return End If Dim networkStream As NetworkStream = client.NetworkStream Dim read As Integer = networkStream.EndRead(result) If read = 0 Then […]

通过TCP发送和接收XML数据

我一直在试图弄清楚如何通过TCP服务器发送和接收XML数据。 我来自java编程背景,所以我有点超出我的深度。 如果我只发送纯文本,我的程序可以工作,但是一旦我尝试发送xml数据,它就会挂起。 服务器永远不会收到消息。 我一直在寻找代码来做到这一点,并没有找到任何运气,我已经看到许多在线的代码示例不起作用。 如果你们中的任何一个人能解决这个问题,我将非常感激。 我在这里寻找代码示例,而不是解释我应该做些什么来解决它。 我只编写了C#几天。 以下是XML请求示例。 AGENT GET_SYSTEM_INFO UMOHB 这是我的TCP客户端代码 public static void sendStringRequest(String hostname, int port, String message) { String response = String.Empty; TcpClient client = getConnection(hostname, port); Console.WriteLine(message); NetworkStream stream = client.GetStream(); StreamWriter writer = new StreamWriter(stream, Encoding.UTF8); writer.AutoFlush = false; writer.Write(Encoding.UTF8.GetBytes(message).Length); writer.Write(message); writer.Flush(); StreamReader reader = new StreamReader(stream, Encoding.UTF8); […]

如何将单独的int值转换为hex字节数组

我需要做一些(对我而言)int / hex / byte工作,我正在努力做到正确。 另一方面的tcp服务器期待Little Endian。 我需要发送一个由HEX值组成的字节数组。 需要发送6000作为: 0x70, 0x17 需要发送19作为: 0x13, 0x00, 0x00, 0x00 生成的字节数组应如下所示。 **FROM THE MANUFACTURER** Complete message should be: 0x70, 0x17, 0x13, 0x00, 0x00, 0x00, 0x40, 0x42, 0x0f, 0x00, 0xA0, 0x86, 0x01, 0x00, 0x04, 0x01, 0x02, 0x03, 0x04 我可以通过使用: .ToString(“x4”)得到6000的hex值为1770我可以使用: .ToString(“x8”)将hex值19作为00000013 我有两个问题: 这(据我所知)是Big Endian。 切断字符串并手动重写以反转字符串,是否有一个.net例程可以为我做这个? 一旦我扭转了,我该怎么做 7017 在一个字节数组中: [0] = […]

偶尔以错误的顺序接收TCP数据并且不完整

我用Java创建了TCP Server应用程序,用C#创建了一个客户端应用程序。 当我发送数据时,客户端有时会无序地接收数据,有时会完全丢失部分。 基本上,我在服务器(java)中使用的代码看起来像这样(剥离): ServerSocket welcomeSocket = new ServerSocket(port); Socket connectionSocket = welcomeSocket.accept(); outputStream = new DataOutputStream(socket.getOutputStream()); //Create stream outputStream.writeBytes(message + “\n”); outputStream.flush(); 我使用“\ n”作为分隔符。 在客户端(C#)我使用以下代码: private const char Delimiter = ‘\n’; tcpclnt = new TcpClient(); tcpclnt.NoDelay = true; tcpclnt.Client.DontFragment = true; tcpclnt.Connect(ip, port); //This function is executed in a separate thread public void Receive() […]

偶发TCP连接失败(WSAEHOSTUNREACH)

在本地千兆网络上,我有一个使用单个TCP服务器和许多客户端的应用程序。 每个客户端每30秒ping一次服务器,打开TCP连接,发送状态消息,然后关闭。 使用SocketAsyncEventArgs设置服务器的方式与此处显示的示例非常相似(为简洁起见,省略) 客户端使用TcpClient启动连接。 客户代码的相关部分: using (TcpClient client = new TcpClient()) { IAsyncResult ar = client.BeginConnect(address, port, null, null); if (!ar.AsyncWaitHandle.WaitOne(timeout)) { throw new ApplicationException(“Timed out waiting for connection to ” + address); } client.EndConnect(ar); //exception thrown 5%-10% of the time //…send message and receive response… } 一切正常,除了在某些机器上,在EndConnect上只有5%-10%的时间抛出exception。 例外是WSAEHOSTUNREACH (10065): System.Net.Sockets.SocketException (0x80004005): A socket operation […]

在C#中通过TCP发送C结构

我正在编写一个程序,通过TCP与一个设备的管理界面进行交互。 问题是,设备的文档是用C语言编写的,而我写的程序是用C#编写的。 我的问题是,文档指定 通信基于基于C结构的API缓冲区 没有任何谷歌搜索似乎可以指向我这个API或我如何通过TCP发送原始结构。 文档似乎暗示我应该使用memcpy将结构复制到TCP缓冲区,但C#不直接支持memcpy。 在C#中是否存在等效方法或以不同方式实现此目的

SQL拒绝加载测试中的连接

我在我的系统上运行负载测试。 在某个加载级别,我开始在日志中收到SQL错误: System.Data.SqlClient.SqlException(0x80131904):建立与SQL Server的连接时发生与网络相关或特定于实例的错误。 服务器未找到或无法访问。 validation实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:命名管道Prprovidererror:40 – 无法连接到SQL Server)—> System.ComponentModel.Win32Exception(0x80004005):找不到网络路径 通过在有问题的SQL服务器上运行性能监视器,我发现了以下内容: CPU级别很少超过50%。 (在之前的迭代中,我看到它最大值为100%,所以我增加了VM的规格,这有助于将问题推向更高的负载水平。) 用户连接数超过8,000。 Sql Server的默认设置为32,767个最大连接数。 连接字符串指定每个数据库的最大池大小为1000个连接,并且服务器上有100个数据库。 负载测试在100个数据库之间随机分布,因此应该有相当均匀的分布,这意味着每个数据库大约有80个连接。 没有接近1k的限制。 还有哪些因素可能会导致Sql Server无法接受连接? 更新:额外信息:我正在使用Entity Framework Core(EF7)进行数据库连接,如果有帮助的话。