2011-10-09 170 views
1

我知道标准的c库函数fwrite和fread是一个排序缓冲的写入和读取系统调用的包装,缓冲区用于我完全理解的性能原因。 我不明白的是在socket编程函数中写入和读取缓冲区的作用。 你能帮我理解它们的用途吗,突出显示与文件缓冲区的区别和相似之处?套接字和缓冲区

我在socket编程新手...

回答

3

当内核收到数据包时,它必须将这些数据放在某个地方。它将其存储在缓冲区中。当你的应用程序进行下一次读取时,它可以从这些缓冲区中获取数据。如果您有UDP连接,并且您的应用程序不读取这些缓冲区,则它会变满并且内核开始丢弃接收到的数据包。如果您有TCP连接,只要缓冲区中有可用空间,它就会确认这些数据包,但在此之后它会发出信号,表示无法读取更多数据。

写入缓冲区是必需的,因为网络接口是稀缺资源,内核通常不能立即发送数据包。如果你做了一个大的写()它可以被切碎成数百包。所以内核会将这些数据存储在缓冲区中。如果您执行了大量小写操作,缓冲区也很出色,请参阅Nagle's algorithm

+0

感谢您的明确和准确的答案。 – GionJh

2

试想一下,如果你在同一时间发送你的信息,一个字节。你会生成一个100字节的数据包发送1个字节,如果它是一个TCP连接,取决于实施,等到你有一个syn/ack发送更多?听起来对我来说效率很低。

相反,您使用缓冲区来存储大量数据并将其发送到单个数据包中,就像在写入磁盘之前存储数据一样。

+1

该策略被称为http://en.wikipedia.org/wiki/Nagle%27s_algorithm,可以禁用。 –

+0

@yi_H我知道它有一个名字:-)谢谢!是的,如果你觉得你知道如何发送数据包比你的网络库的实现者可以被禁用。 – corsiKa

+0

不,可以禁用它立即发送数据包。延迟可能比浪费的带宽更重要。 –