【问题标题】:Is there any data missing?是否缺少任何数据?
【发布时间】:2010-12-25 19:45:17
【问题描述】:

这里引用了 Douglas.E.Comer 的第 4 版的一些代码。该程序将发回它收到的任何数据。

...
while((len = recv(conn, buff, BUFFERSIZE,0)) >0) // receive data
        send(conn, buff, len, 0); // send it back
...

我想知道,如果在 send(..) 函数中执行代码时到达了一些数据,它会丢失该数据吗?因为没有执行 recv() 函数。如果没有数据丢失,数据保存在哪里?又是谁?

谢谢...

【问题讨论】:

    标签: networking network-programming


    【解决方案1】:

    系统会缓冲传入的数据,直到下一次调用recv() 函数。尚未读取的这些数据存储在操作系统内部的缓冲区中,而不是您的应用程序内部。您不会使用这样的循环“错过”传入数据。

    【讨论】:

    • 谢谢格雷格。所以实际上有两种类型的缓冲区。我的应用程序的缓冲区和操作系统的缓冲区。如果数据太多,操作系统的缓冲区会被淹没吗?然后会发生什么?
    • 如果您的接收应用程序没有足够快地读取足够的数据,那么操作系统将告诉 sending 机器停止发送更多数据。反过来,发送机器的操作系统将有自己的输出数据缓冲区来保存send()从发送应用程序传递的数据,如果 那些 填满,那么发送应用程序将阻塞它的调用到send()
    • 所以这一切都是由操作系统或库方法(如 send())正确安排的。看来我们只需要关心我们的编程逻辑就可以正确使用基础设施。
    【解决方案2】:

    每个套接字都有一个关联的内存缓冲区,数据正在被缓冲,当您调用recv API时,如果缓冲区中存在一些数据,则从缓冲区中读取数据,否则调用等待直到套接字缓冲区中有一些数据可用。

    【讨论】:

    • 感谢 Ankur。请参阅我对 Greg Hewgill 的回复。
    • 您的理解是正确的,即您只需要专注于您的应用程序逻辑。 TCP 的建立是为了确保数据包的传递。我不确定这是否与 UDP 套接字中的情况相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多