【问题标题】:Where does socket store data?套接字在哪里存储数据?
【发布时间】:2020-01-09 00:39:53
【问题描述】:

我们有 TCP 套接字连接,从我的计算机到远程地址。

请澄清以下几点:

  1. socket TCP连接完成后,客户端端口打开,服务器端口也打开?

  2. 我想了解当我们向套接字写入内容时,套接字将数据保存在哪里?我们在服务器和客户端上有两个相同的文件?还是存储在 RAM 内存中的数据?

  3. 如果数据存储在文件中,我可以在 linux 上找到文件,尤其是在 ubuntu 18.04 上吗?

【问题讨论】:

    标签: linux sockets tcp


    【解决方案1】:
    1. socket TCP连接完成后,客户端的端口打开了,服务器的端口也打开了?

    是的。

    1. 我想了解当我们向套接字写入内容时,套接字将数据保存在哪里?我们在服务器和客户端上有两个相同的文件?还是存储在 RAM 内存中的数据?

    您不能在服务器和客户端上拥有相同的文件,除非它们都在同一台机器上。但即使它们是,整个数据都保存在每个套接字的内存中:一个缓冲区用于传入数据,一个缓冲区用于传出。当新数据到来时,操作系统会对其进行缓冲,直到应用调用 .read()。请注意,这是一个实现细节。

    1. 如果数据存储在文件中,我可以在 linux 上找到文件,尤其是在 ubuntu 18.04 上吗?

    它不在文件中。

    【讨论】:

    • 是的,这正是我刚刚写的。
    • 非常感谢!最后一个问题:是否有清除内存或缓冲区的做法?因为我面临 RAM 泄漏
    • 不,没有这种做法。你永远不应该这样做,它会以许多不可预测的方式破坏东西。无论您遇到什么,这很可能是您的应用程序中的一个错误。
    • 因此,在我从套接字读取数据后,必须清除 RAM,对吗?或者在某些时候它必须自动清除。既然你说我不必清除它
    • @Mikael 缓冲区总是占用一些内存。只要套接字还活着,它们就活着。但是缓冲区不会占用太多内存。我认为默认情况下每个套接字大约 16kb(我也认为这是可配置的)。一旦你 .close() 套接字,操作系统将释放内存。始终关闭不再需要的文件描述符至关重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2012-04-11
    相关资源
    最近更新 更多