首页 > 解决方案 > 以太网缓冲区可以填满并且不允许另一个进程接收()以太网数据包吗?

问题描述

假设您有一个从服务器接收大文件的进程。

  1. 如果您不执行 recv() 调用,它会永远留在以太网控制器的缓冲区中吗?

  2. 如果另一个进程需要接收数据并且另一个进程的缓冲区已满,它是否需要等到另一个进程执行 recv() 或缓冲区超时?

  3. 如果您有多个进程发送和接收数据,是否必须等到缓冲区为空。?或者它可以多路复用它并在驱动程序级别或套接字库的某些部分进行跟踪?

编辑:拼写

标签: csocketsethernet

解决方案


  1. 如果您不执行 recv() 调用,它会永远留在以太网控制器的缓冲区中吗?

不,数据永远不会在以太网控制器的缓冲区中停留很长时间;内核将尽可能快地将数据从以太网控制器的缓冲区中读取到您的套接字缓冲区(在计算机的常规 RAM 中)。如果您的套接字缓冲区已满,则传入的数据将被丢弃。

  1. 如果另一个进程需要接收数据并且另一个进程的缓冲区已满,它是否需要等到另一个进程执行 recv() 或缓冲区超时?

每个套接字在计算机的主 RAM 中都有自己独立的缓冲区,每个进程都有自己的套接字,因此进程不必等待彼此的缓冲区清空。

  1. 如果您有多个进程发送和接收数据,是否必须等到缓冲区为空。?

请参阅问题 2 的答案,因为它也回答了这个问题。


推荐阅读