Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 套接字和缓冲区_C_Sockets - Fatal编程技术网

C 套接字和缓冲区

C 套接字和缓冲区,c,sockets,C,Sockets,我知道标准c库函数fwrite和fread是写和读系统调用的一种缓冲包装,缓冲区的使用是出于我完全理解的性能原因。 我不明白的是缓冲区在套接字编程函数的读写中的作用。 你能帮我理解它们的用途吗?突出显示它们与文件缓冲区的区别和相似之处 我是一名套接字编程新手…想象一下,如果您每次发送一个字节的信息。您将生成一个100字节的数据包来发送1个字节,如果它是TCP连接,则根据实现情况,等待获得syn/ack后再发送更多?我觉得效率很低 相反,您可以使用缓冲区存储大量数据并在单个数据包中发送,就像在写入

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


我是一名套接字编程新手…

想象一下,如果您每次发送一个字节的信息。您将生成一个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对其进行了优化,这对大多数应用程序都有好处(因此这是一个很好的默认设置)。对于其他人来说,这只是一个障碍。