c - 当使用读写系统调用时,套接字中的数据会发生什么?

标签 c linux sockets

这是指 C 套接字。假设我已经向套接字写入了一些数据,然后我调用read,read系统调用会读取缓冲区大小(例如4096等)信息并删除套接字中的所有信息吗?基本上 read 只是将查找指针向前移动到它读取的那些字节,或者它会读取并删除套接字中的所有信息,以便下次调用 read 时,它从第 0 个索引读取?

或者说我写入套接字而不从其他地方调用读取?数据会被替换或附加吗?

最佳答案

如果套接字上的可用数据多于您read()的数量,则多余的数据将保留在套接字的缓冲区中,直到您读取它。短时间读取期间不会丢失任何数据。

写作的原理与此类似。如果多次调用write(),则每次写入都会将数据追加到远程主机上的缓冲区中。同样,没有数据丢失。

(最终,远程主机上的缓冲区将填满。当发生这种情况时,write() 将阻塞——本地主机将等待缓冲区清空,然后再发送更多数据。)

从概念上讲,套接字对中的每个方向的行为就像两个对等方之间的管道。无论一次读取/写入多少数据,发送的整个数据流都将按照发送的顺序接收。

关于c - 当使用读写系统调用时,套接字中的数据会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43750515/

相关文章:

sockets - 具有外部套接字连接的Heroku worker 作业可以并行运行吗?

c# - 计算闪存驱动器内容的校验和

c - C的strtok函数支持正则表达式吗?

linux - 'printk'如何获取高分辨率的当前时间?

c - popen() 在 Linux 上调用,这几行是做什么的?

python - 如何在 Python 中使用套接字作为上下文管理器?

c - 我的代码 : reversing words in a string? 的时间复杂度是多少 我应该考虑不对称间距吗?

c - 从nginx模块中的ngx_http_request_t获取ip和url

Linux - 找到一个垂死进程的所有 child (我自己的孙子)

java - socket虽然连接不上,但不抛异常