C 套接字和缓冲区
我知道标准c库函数fwrite和fread是写和读系统调用的一种缓冲包装,缓冲区的使用是出于我完全理解的性能原因。 我不明白的是缓冲区在套接字编程函数的读写中的作用。 你能帮我理解它们的用途吗?突出显示它们与文件缓冲区的区别和相似之处C 套接字和缓冲区,c,sockets,C,Sockets,我知道标准c库函数fwrite和fread是写和读系统调用的一种缓冲包装,缓冲区的使用是出于我完全理解的性能原因。 我不明白的是缓冲区在套接字编程函数的读写中的作用。 你能帮我理解它们的用途吗?突出显示它们与文件缓冲区的区别和相似之处 我是一名套接字编程新手…想象一下,如果您每次发送一个字节的信息。您将生成一个100字节的数据包来发送1个字节,如果它是TCP连接,则根据实现情况,等待获得syn/ack后再发送更多?我觉得效率很低 相反,您可以使用缓冲区存储大量数据并在单个数据包中发送,就像在写入
我是一名套接字编程新手…想象一下,如果您每次发送一个字节的信息。您将生成一个100字节的数据包来发送1个字节,如果它是TCP连接,则根据实现情况,等待获得syn/ack后再发送更多?我觉得效率很低
相反,您可以使用缓冲区存储大量数据并在单个数据包中发送,就像在写入磁盘之前存储数据一样。想象一下,如果您每次发送一个字节的信息。您将生成一个100字节的数据包来发送1个字节,如果它是TCP连接,则根据实现情况,等待获得syn/ack后再发送更多?我觉得效率很低
相反,您可以使用缓冲区存储大量数据并在单个数据包中发送,就像在写入磁盘之前存储数据一样。当内核接收到数据包时,它必须将这些数据放在某个地方。它将其存储在缓冲区中。当你的应用进行下一次读取时,它可以从这些缓冲区获取数据。如果你有一个UDP连接,而你的应用程序没有读取这些缓冲区,那么缓冲区就会被填满,内核会开始丢弃接收到的数据包。如果您有TCP连接,只要缓冲区中有可用空间,它就会确认数据包,但在此之后,它会发出信号,表示无法读取更多数据包
写缓冲区是必要的,因为网络接口是一种稀缺资源,内核通常无法立即发送数据包。如果你做一个大的write(),它可能会被切碎成数百个数据包。因此内核将把数据存储在缓冲区中。如果您进行大量的小写操作,缓冲区也能很好地工作,请参阅。当内核接收到数据包时,它必须将这些数据放在某个地方。它将其存储在缓冲区中。当你的应用进行下一次读取时,它可以从这些缓冲区获取数据。如果你有一个UDP连接,而你的应用程序没有读取这些缓冲区,那么缓冲区就会被填满,内核会开始丢弃接收到的数据包。如果您有TCP连接,只要缓冲区中有可用空间,它就会确认数据包,但在此之后,它会发出信号,表示无法读取更多数据包
写缓冲区是必要的,因为网络接口是一种稀缺资源,内核通常无法立即发送数据包。如果你做一个大的write(),它可能会被切碎成数百个数据包。因此内核将把数据存储在缓冲区中。如果您进行大量的小写操作,缓冲区也可以很好地工作,请参阅。此策略被调用,并且可以禁用。@yiuh我知道它有一个名称:-)谢谢!是的,如果您觉得自己比网络库的实现者更了解如何发送数据包,则可以禁用它。不,可以禁用它以立即发送数据包。延迟可能比浪费的bandwith更重要。@yi_H您的意思是,通过立即发送,您减少了延迟,但情况并非总是如此。但这正是我的意思,我的意思是,您比库的实现者更了解如何发送数据包。他们的想法是对它进行了优化,你会说“不,关掉它-我需要它以不同的方式工作”。这可能是危险的,因为很可能你们(你们是一个普通的开发人员)并没有比编写标准网络库的人更好地解决这些问题。看起来你们对他们的优化的理解是不完整的。这并不是说你优化了某样东西,它会比其他任何东西都优越。你需要一个目标/成本函数。在本例中,他们针对banwith对其进行了优化,这对大多数应用程序都有好处(因此这是一个很好的默认设置)。对于其他人来说,这只是一个障碍。此策略被称为并且可以禁用。@yiuh我知道它有一个名称:-)谢谢!是的,如果您觉得自己比网络库的实现者更了解如何发送数据包,则可以禁用它。不,可以禁用它以立即发送数据包。延迟可能比浪费的bandwith更重要。@yi_H您的意思是,通过立即发送,您减少了延迟,但情况并非总是如此。但这正是我的意思,我的意思是,您比库的实现者更了解如何发送数据包。他们的想法是对它进行了优化,你会说“不,关掉它-我需要它以不同的方式工作”。这可能是危险的,因为很可能你们(你们是一个普通的开发人员)并没有比编写标准网络库的人更好地解决这些问题。看起来你们对他们的优化的理解是不完整的。这并不是说你优化了某样东西,它会比其他任何东西都优越。你需要一个目标/成本函数。在本例中,他们针对banwith对其进行了优化,这对大多数应用程序都有好处(因此这是一个很好的默认设置)。对于其他人来说,这只是一个障碍。