是否有单独的缓冲区用于读取和写入库调用?

are there separate buffer for read and write library calls?

提问人:Rajat Aggarwal 提问时间:10/27/2023 更新时间:10/28/2023 访问量:58

问:

我正在尝试了解如何从同一文件描述符读取和写入数据。

network - socket
    connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)
    write(sockfd, buff, large_buffer_size)

当程序/操作系统将数据写入文件描述符时,假设我们同时从服务器接收数据。

现在,我想知道如何确保数据不会损坏,即要写入的数据和要读取的数据不会混合,因为我们指向相同的文件描述符?

C 套接字 操作系统

评论

5赞 Marco Bonelli 10/27/2023
是的,有。
0赞 Rajat Aggarwal 10/27/2023
@MarcoBonelli您能分享一些链接/视频,我可以在其中了解如何处理此问题。
2赞 datenwolf 10/27/2023
@RajatAggarwal:这方面的细节完全由操作系统开发人员自行决定。Linux 实现它的方式已在 vger.kernel.org/~davem/skb.html 中描述过——然而,这篇文章已经有几年的历史了,其中的信息可能不再准确地反映现在的情况。如有疑问,请阅读源代码。
0赞 user207421 10/28/2023
套接字具有发送缓冲区和接收缓冲区。

答:

2赞 John Bollinger 10/28/2023 #1

套接字的不寻常之处在于它们通过单个文件描述符提供全双工通信。内核会执行使其平稳和正确工作所需的工作,其中包括,是的,分别缓冲传出和传入的数据。从语义上讲,每个套接字确实将两个单独的通道绑定在一起,每个方向一个。您甚至可以彼此独立地关闭这些通道。