草庐IT

c++ - TCP 缓冲区解析器

我想实现一个协议(protocol)来在服务器和客户端之间共享数据。我不知道正确的那个。通过将性能作为主要标准,任何人都可以建议解析数据的最佳协议(protocol)。我有一个想法,不要实际名称,但它会像这样[Header][Message][Header][Message]header包含消息的长度,header大小是固定的。我已经通过执行大量成本更高的连接和子字符串操作来尝试一些。任何人都可以为此建议最佳实现 最佳答案 这个问题很广泛。关于避免缓冲区/字符串连接的主题,如缓冲区序列,在BoostAsio's"Scatter-Ga

delphi - 来自 TCustomWinSocket 的 ReceiveBuf 不适用于缓冲区的动态数组

我正在尝试使用TServerSocket组件通过TCP套接字接收缓冲区(我正在维护一个遗留应用程序,因此暂时无法迁移到Indy或其他任何应用程序)。我已经实现了一个OnClientRead事件的方法,该方法在非阻塞套接字中读取此缓冲区(同样,我不能对这个遗留应用程序进行重大更改)。函数如下所示:procedureTFrmMain.ServerSocket1ClientRead(Sender:TObject;Socket:TCustomWinSocket);varSize:Integer;Bytes:TBytes;beginSize:=Socket.ReceiveLength;SetLe

c - 如何以原子方式发送()缓冲区,以便不分派(dispatch)它们?

目前我有一个问题,如果我发送一个缓冲区,它可能只发送部分并返回发送的字节数。有没有办法设置一些选项或某事。这会阻止bsd套接字部分发送? 最佳答案 一般来说,对于SOCK_STREAM套接字类型(例如TCP),无法做到这一点。SOCK_DATAGRAM(对于IP,这意味着UDP)和SOCK_SEQPACKET(对于IP,没有这样的东西)会做你想做的事,但有不同的限制。无论如何,解决方案是您需要自己进行数据缓冲和分帧。也就是说,您需要在发送的流中包含带内信息,以允许接收方重建您想要的“数据包”边界。

c++ - 成功接收后清空缓冲区

我正在用C++在Windows上编写一个服务器,我在使用recv()时遇到了一个奇怪的行为。我写了这个函数:boolreadN(SOCKETs,intsize,char*buffer){fd_setreadset;structtimevaltv;intleft,res;FD_ZERO(&readset);FD_SET(s,&readset);left=size;std::cout0){tv.tv_sec=MAXWAIT;tv.tv_usec=0;res=select(0,&readset,NULL,NULL,&tv);if(res>0){res=recv(s,buffer,left,0

tcp - 当以太网接收缓冲区已满时会发生什么

我有一个新手问题:假设我有两个设备通过以太网(TCP/IP)以100Mbps进行通信。一方面,我将向设备提供要传输的数据。另一方面,我将使用接收到的数据。我有能力为两个设备选择足够的缓冲区大小。现在我的问题是:如果第二台设备的数据消耗速率低于第一台设备的数据馈送速率,那么会发生什么?我找到了一些,谈论超限计数器。以太网通信中是否有任何指示设备暂时忙碌且无法接收新数据包的信息?这样我就可以暂停接收设备的传输。谁能给我提供一份或多份文件来详细解释这个问题,因为我没有找到。提前致谢 最佳答案 以太网协议(protocol)运行在MACCo

sockets - 当内部缓冲区填满时 TCP 会发生什么

假设我们有以下TCP套接字设置,其中客户端向服务器发送任意数据。将以下内容视为伪代码。defclient():whileTrue:data=source.get_data()client_socket.send(data)服务器读取数据并使用它来做某事...defserver():whileTrue:data+=socket.recv(4096)parsed_data=parse_data(data)cpu_intensive_task(parsed_data)让我们假设客户端发送数据的速度比服务器处理的速度快得多。内部网络缓冲区可以填满吗?我假设答案是肯定的......如果是这样,那

Linux TCP/IP 非阻塞发送套接字流..TCP 接收缓冲区发生了什么?

这与Linux内核2.6TCP套接字有关。我正在发送大量数据,比如300MB,并以非阻塞方式发送给另一个客户端,该客户端一次接收8MB。接收一个8MB后,“接收方”停止接收,因为它要执行其他任务,例如错误处理。发送方会收到EWOULDBLOCK,但由于它是异步通信,发送方会尝试填充另一端的TCP接收缓冲区。我的问题是:即使“发送方”收到EWOULDBLOCK而“接收方”停止接收,TCP接收缓冲区中是否仍有数据?同一个套接字用于错误处理,那么“接收方”是否必​​须在尝试重用现有套接字之前清除TCP接收缓冲区? 最佳答案 是的。当您收到

c# - NetworkStream.CanRead 返回 true 但缓冲区不返回任何值

我有一个dowhile循环,它从NetworkStream对象中读取缓冲区while条件是networkStream.CanRead所以只要它可以读取,它就应该继续从缓冲区读取。唯一的问题是当我从缓冲区读取并转换为字符串时,里面什么也没有。即它是空的。为什么会这样?这是一个ASP.NET(VS2005)应用程序@dtb代码信息:我正在传递NetworkStream对象networkStream//between2functionsinaloop{SendMessage(networkStream,message);ReadMessage(networkStream);}有趣的是,如果它

linux - 除了缓冲区已满以外,EAGAIN 会在发送时返回吗?

如果我在Linux中的非阻塞tcp套接字上使用send(),除了发送缓冲区已满情况之外,它会返回EAGAIN吗?我基本上需要决定是要将套接字发送缓冲区用作我的应用程序的唯一缓冲区,还是需要我自己的用户空间缓冲区来提供套接字缓冲区。 最佳答案 它不应该,但我看不出这会如何影响您对用户空间缓冲区的决定。无论获取EAGAIN的具体原因是什么,您是否需要缓冲区取决于您的应用正在做什么。您还可以考虑使用setsockopt更改tcp缓冲区大小在进行一些计算后使用SO_SNDBUF选项查看它是否真的是性能胜利。

c - 关于 TCP 连接缓冲区的问题

Linux。我在两台计算机之间使用以太网电缆。一个用C编写的简单的服务器-客户端程序,用于将文件从客户端传输到服务器。客户端从文件中读取100字节的数据发送给服务器,然后等待2秒再发送下一个数据包。当客户端发送数据时,我拔掉了服务器端的以太网电缆,由于连接中断,我预计客户端会出现一些错误。但是客户端一直在将数据写入管道,而服务器没有收到任何东西(但仍在等待接收)。客户端发送了整个文件并停止了。现在,我再次连接以太网电缆,服务器接收客户端发送的所有数据。这怎么可能?数据包是否存储在某个缓冲区中并在连接建立时再次发送?很抱歉让它太长了。 最佳答案