C ++套接字256字节缓冲区

时间:2009-04-15 00:34:49

标签: c++ sockets buffer

我试图在C ++中使用一些套接字网络编程。我正在尝试发送文本“Hello World!”使用C ++ send()函数到服务器。首先,我将缓冲区设置为自“Hello World!”以来的13。一共是12个字符(你必须使它比字符数多一个)。如果我发送大约7次,send函数只会将字符发送到服务器。当它最终到达服务器时,它看起来像这样:

“Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!”

现在这是有趣的部分。 “Hello World!”如果我将缓冲区大小设置为256(char buffer [256];),则立即发送句子。说到这样的服务器,它显示“Hello World!”两个字后有一大堆空格。为什么会发生这种情况,如果可能的话,我该如何解决?请告诉我。

由于

5 个答案:

答案 0 :(得分:7)

当您使用缓冲区调用read(或receive)从套接字读取时,将返回一个整数值,指定读取的字节数。你应该只从缓冲区中拿走那么多。其余的是无关紧要的:

int count = read(...);
// buffer[0 .. count - 1] contains the appropriate data.

答案 1 :(得分:6)

Nagle的算法通常默认打开。这将把几个小包组合成一个。关闭Nagle的算法将允许立即发送小数据包。

答案 2 :(得分:4)

在您准备好发送数据之前,存在缓冲区来存储数据。您的发送缓冲区大小为256.在通过缓冲区传输256个字符之前,您的数据将不会发送到另一侧。当您知道准备发送时,可以通过在缓冲区上调用flush方法来解决此问题。

要明确的是,您在内部缓冲,然后当您调用send()并传递一些数据时,OS(或库)会再次缓冲。

如果您对使用的库更具体,并且可能包含代码段,我们可能会找到正确的缓冲区刷新功能,以便随身携带。

或者,如果您在* nix中,只需关闭Nagle的算法,以便操作系统不会缓冲您的小数据包。或者,当您设置套接字时,请确保使用TCP_NODELAY选项

答案 3 :(得分:0)

假设这是一个SOCK_STREAM套接字,需要注意的重要事项是底层TCP协议不会维护任何段边界。也就是说,当您多次调用send()时,您发送的所有数据可能很容易通过另一端的单个recv()调用返回。或者,在一个send()调用中发送的数据可以在另一端的多个recv()中返回,例如,如果某些数据包由于网络拥塞而延迟这是TCP设计的基础,您的应用程序必须相应地进行设计。

另外,正如Mehrdad所指出的,recv()调用返回从线路读取的字节数。缓冲区中该点之后的任何内容都是垃圾,并且数据不会以零终止。

SOCK_DGRAM套接字使用底层的UDP,这完全是面向数据包的,而不是像TCP那样的面向流的套接字。但是,UDP不保证可靠性(U代表不可靠),因此您必须自己处理丢失,重复,无序等数据包。这比面向流的I / O要困难得多。

答案 4 :(得分:0)

套接字编程繁琐,容易出错且无法移植。开始使用BoostACE之类的库来保护您免受低级C API的攻击,并为您提供与平台无关的抽象。