草庐IT

read_buffer

全部标签

c++ - 使用read函数从socket中读取数据

我正在尝试使用以下代码从套接字读取数据:n=read(fd,buffer,50000);问题是:当来自web服务器的数据大于tcp包大小时,这些数据会被拆分成多个包。在这种情况下,read函数是只从fd中读取一个数据包,还是从fd中读取所有数据包?请注意,read函数只被调用一次。 最佳答案 因为您使用的是TCP,所以您的套接字类型为SOCK_STREAM。SOCK_STREAM套接字是字节流,不维护数据包边界,因此调用read()或recv()将读取数据如果已收到多个数据包并且缓冲区中有足够的空间,则来自多个数据包。如果您的缓冲区

c++ - google protocol buffers - 位错误的概率和减少它们的方法

我通过TCP通过Internet通过无线VPN通过VPN传输相当大量的谷歌ProtocolBuffer消息,我觉得我得到了相对较高的错误率(例如,bool字段从false切换为true或类似的东西)。大约在10,000分之一到50,000分之一之间。这可能吗?维基百科指出TCP的校验和很弱,但这通常在底层协议(protocol)中得到修复:TCP校验和是现代标准的弱校验。具有高误码率的数据链路层可能需要额外的链路纠错/检测功能。弱校验和通过在TCP和IP下面的第2层普遍使用CRC或更好的完整性校验来部分补偿,例如在PPP或以太网帧中使用的那样。有没有人知道预期错误率应该是多少?如果上述

tcp - 错误 : couldn't read version from server: Get http://localhost:8080/api: dial tcp 127. 0.0.1:8080:连接被拒绝

我使用以下步骤在Linux上安装了Kuberneteshere.一切正常,直到我退出终端并打开一个新的终端session。我收到一个权限被拒绝的错误,在重新启动我的机器后我收到以下错误>kubectlgetpoderror:couldn'treadversionfromserver:Gethttp://localhost:8080/api:dialtcp127.0.0.1:8080:connectionrefused我刚刚开始使用Kubernetes,如有任何帮助,我们将不胜感激。 最佳答案 似乎是TCP问题。尝试通过检查TCP/8

c - 对于 TCP,从 "write()"返回是否意味着对端应用程序具有 "read()"数据?

我正在编写一个C/S程序,客户端和服务器都可以在任意时间向对等方发送数据(无需显式确认)。我想知道如果客户端和服务器巧合地同时写入对等点,是否可能会死锁。那么从write()返回是否意味着对等应用程序已经read()了数据?或者它仅意味着对等方的内核已获取数据并将在下一个read()时传递给应用程序?(EJP的回答修正了我对write()/send()/...的完全错误理解。为了添加一些权威信息,我在关于send的POSIX标准中找到了这个:Successfulcompletionofacalltosend()doesnotguaranteedeliveryofthemessage.A

c - 带有 TCP 流的 TLS/SSL 中的 ssl_read() 不返回由 BIO_write() 写入的整个缓冲区

以下代码部分的目的是轮询套接字fd集,如果数据(ssl加密)可用,则读取它并通过openssl库解密。底层传输层是TCPStream,所以数据以流的形式出现(不是数据包)。现在,如果从对等方快速连续发送多个数据包(假设2个长度为85字节的数据包),则TCP接收将在同一缓冲区中返回两个数据包,接收字节数为170。因此,我们有一个缓冲区,其中包含2个ssl加密数据包(或n个数据包)。对于ssl解密,我们需要调用BIO_write()将缓冲区写入ssl_bio,然后调用ssl_read()来检索解密的缓冲区。但是,尽管BIO_write()正在向bio中写入170个字节,但ssl_read(

sockets - Modbus TCP :Is there any better way for reading registers randomly one or more?

我们正在编写一个Windows服务,通过C#中的Socket编程,使用ModbusTCP协议(protocol)以1秒的轮询间隔从PLC读取数据。WindowsService会接收PLC的随机寄存器来读取寄存器值。预期随机注册,如40150、40250、40270、40320。从上面的案例如何创建ModbusTCP请求头?我们可以找到两种可能的方法:使用功能代码3,我们可以读取特定范围内的寄存器的值,例如从40150到40320,这样我们就可以读取这40150,40250,40270,40320寄存器值。另一种方式是逐个请求40150、40250、40270、40320这几个寄存器(这

c# - 使用 .Net 的 NetworkStream.Read/BeginRead 分隔应用程序协议(protocol)帧

我的问题对网络编程来说更笼统,但因为我正在尝试编写一个ModbusTCP服务器(从站),所以我将用它来说明我的问题。在ModbusTCP帧中,帧的第5和第6个字节给出了帧的大小:字节1和2:交易ID字节3&4:协议(protocol)Idbytes5&6:帧中剩余多少字节字节7-n:帧的其余部分。当使用NetworkStream.Read()/BeginRead()时,如何分隔接收到的帧?我看到一些开源实现只读取前6个字节,解析字节5和6以获得帧其余部分的大小,然后读取帧的其余部分。但是,如果您的框架中没有开始和结束定界符,您如何知道框架的开始和结束位置?例如,客户端可能发送了一些垃圾

java - 与 Java 服务器的 PHP tcp 连接在 socket_read() 上挂起

我正在尝试创建一个PHP客户端来连接到一个简单的Java服务器,发送一些数据,然后接收返回的响应。Java服务器在与用Java编码的简单客户端交互时响应良好,但是一旦从PHP客户端发送请求,它就会在调用socket_read()时无限期挂起。如果这一行被注释掉,数据就可以正常到达,但如果没有注释掉,就好像Java服务器根本没有接收到数据。这与之前提出的问题非常相似:SimpleJavaTCPServerandPHPClientProblems但据我所知,我的代码在操作上与给出的解决方案几乎相同。Java服务器是多线程的,用于程序的其他部分,我不认为这是导致问题的原因。php脚本有一个U

java - 谷歌 Protocol Buffer (Java 到 C++)

我正在尝试在Java和C++之间设置TCP/IP套接字连接,在Windows上使用Java,在RaspberryPi上使用C++。正在传输的消息是GoogleProtocolBuffer消息,其原型(prototype)设置如下:packagepackage_name;messageWin2Pi{optionalint32num1=1;optionalint32num2=2;optionalint32num3=3;optionalint32num4=4;optionalboollogic1=5;optionalboollogic2=6;optionalboollogic3=7;opti

sockets - 为什么 skb_buffer 需要跳过 20 个字节才能在数据包输入时读取传输缓冲区?

我正在Linux中编写一个网络模块,我看到只有从skb缓冲区跳过20个字节后才能提取tcpheader,即使API是“skb_transport_header”。其背后的原因是什么?有人可以详细解释一下吗?传出数据包不需要同样的。我知道在接收数据包时,当数据包从L1流向L5时,header会被删除。但是,当数据包传出时,会添加header。这在这里有何不同?/**对于输入包**/structtcphdr*tcp;tcp=(structtcphdr*)(skb_transport_header(skb)+20);/**对于传出数据包**/structtcphdr*tcp;tcp=(str