草庐IT

c - Recv 环形缓冲区与简单缓冲区

我正在开发客户端-服务器应用程序。我的应用程序使用可变大小的数据包,每个数据包都有一个header和可变长度的有效负载。我的难题是在执行recv时处理数据包的最佳方法是什么。我遇到的大多数教程都建议使用环形缓冲区,但据我所知,使用大小是您可以处理的最大数据包大小两倍的缓冲区会更有效。如果我使用环形缓冲区,我需要一个额外的缓冲区用于接收,然后我需要将缓冲区复制到环形缓冲区中,这意味着我需要执行一两个memcpys以将缓冲区插入环形缓冲区中如果我使用单缓冲区方法,我只需要一个缓冲区,我可以将其传递给recv调用和一个memmove调用,以便在我得到一个完整的数据包并且仍然有数据属于另一个数

c# - 你如何在 C# 中使用 TCP 客户端读取整个输入缓冲区?

我已通过套接字连接到要查询的设备。我可以毫无问题地发送命令,但是当我尝试取回数据时,它会将它分成几部分发回给我,这样我就永远不会一次真正收到完整的消息。我已经求助于多个try-catch序列来尝试连续获取不同的部分,但我只是以最后一个block结束。我认为存在时间问题但不确定,此外,代码完成后文本框不显示任何文本,我认为它们至少应该显示收到的部分内容。任何建议将不胜感激Byte[]Backdata=newbyte[64];//alsotried32,16,64MoxaClient=newTcpClient();MoxaClient.Connect(NportAddress,NportP

c++ - 缓冲区中TCP数据是否可以重叠

如果我一直向接收方发送数据,发送的数据是否可能重叠,以至于它们在缓冲区中累积,因此下一次读取缓冲区时也会读取另一个已发送数据的数据?我正在使用Qt和readAll()接收数据并解析它。该数据中有一些结构,所以我可以知道数据是否已经完整或者它是否是有效数据,但我担心当我调用readAll()时其他数据会与其他数据重叠因此会使这个假设有效的数据无效。如果它可能发生,我该如何预防/控制它?或者这是OS/API担心的事情?我担心的部分原因是该方法的调用方式。哈哈 最佳答案 TCP是基于流的连接,而不是基于数据包的连接,因此您可能不会假设一次

c++ - 套接字中的页面对齐发送缓冲区

很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭10年前。在64位Linux上,我的应用程序发送二进制消息,这些消息大小可变且未在64位边界上对齐。比如可能发送1026bytes、85bytes等等。在这种情况下,页面对齐套接字发送和接收缓冲区大小是否有帮助或伤害或无关紧要?该应用程序是用c编写的,运行在rhel6.3x和2.6.32.x86_64内核上。更新:对于缓冲区,我最初指的是SO_SNDBUF和SO_RCVBUF,它们由setsockopt设

sockets - 在 Netty 上发送图像文件的套接字发送缓冲区的最佳设置

我正在考虑在Netty中实现一个HTTP图像服务器,我想知道最佳发送缓冲区大小应该是多少:ie.bootstrap.setOption("sendBufferSize",1048576);我读过HowtowriteahighperformanceNettyClient但我想知道将此值设置得太小或太大的后果是什么。我提供的图片大多在100K到5MB左右(平均1MB)。我认为较大的值(1MB)会导致操作系统内存充满TCP缓冲数据,但是将其设置为较小的值(即8192KB)是否会降低性能? 最佳答案 您可能会找到thisarticle有用。

linux - TCP 套接字发送缓冲区大小效率

当使用WinSock或POSIXTCP套接字(在C/C++中,因此没有额外的Java/Python/等包装)时,在用户中建立更大的缓冲区(例如最多4KB)是否有任何效率优势/劣势space然后尽可能少地调用发送以发送该缓冲区vs直接使用数据位(比如1-1000字节)进行多个较小的调用,其他事实是对于非阻塞/异步套接字,单个缓冲区可能是对我来说更容易管理。我知道不建议使用recv小缓冲区,但我找不到要发送的内容。例如公共(public)平台上的每个发送调用都会进入内核模式吗?在正常情况下,1字节的发送实际上会导致1字节的数据包被传输吗? 最佳答案

c# - 收到数据包后刷新缓冲区

这个问题在这里已经有了答案:Sockettcpc#howtoclearinputbuffer?(2个答案)关闭7年前。我正在使用以下代码从工具接收TCP数据包。while(socket.Connected){varbuffer=newbyte[4096];intreceiveLength=socket.Receive(buffer);if(receiveLength!=0){byte[]response=newbyte[4096];ProcessPacketData(buffer,outresponse);socket.Send(resposne);}//Sleep(100);}当使用

tcp - 在 tcp 中,每个连接一个接收缓冲区?或者所有连接共享一个缓冲区?

例如,在服务器端点,如果我将接收缓冲区大小设置为1k,并且有100个连接,这100个连接共享这1k接收缓冲区吗?或者每个连接都有自己的1k接收缓冲区?发送缓冲区是否相同? 最佳答案 Forexample,intheserverendpoint,ifIsetthereceivebuffersize1k,andthereis100connections.Isthese100connectionssharethis1kreceivebuffer?没有。Oreachconnectionhastheirown1kreceivebuffer?见

tcp - WSASend() 是否隐藏了大缓冲区的批处理?

我现在正在测试大缓冲区,我在WSABUF中设置它,然后调用WSASend()。不过,WSARecv()只是一次性将它交回了那个大缓冲区。这有意义吗?对于大缓冲区,WSASend()和WSARecv()的限制在哪里?似乎批处理是在后台进行的,所有这些都隐藏在抽象之后。如果是这种情况,我希望我的应用程序始终发生这种情况。 最佳答案 限制分别是套接字发送和接收缓冲区大小。WSASend()在套接字发送缓冲区已满时阻塞,并在所有内容都已传输到套接字发送缓冲区时返回。同时,TCP异步地从套接字发送缓冲区中移除数据,以一种您无法控制的方式将其转

c# - 索引和计数必须引用缓冲区内的位置。参数名称 : bytes

大家好,我收到了这个错误,请参阅附件>>索引和计数必须引用缓冲区中的某个位置。参数名称:bytes当我使用调试器时,我没有收到这个错误,一切正常,我不明白这个错误是什么这是我的服务器代码:IPEndPointipEnd=newIPEndPoint(IPAddress.Any,27015);Socketsck=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.IP);sck.Bind(ipEnd);sck.Listen(100);SocketclientSocket=sck.Accept();strin