• 周五. 12月 9th, 2022

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

write/writev/send与阻塞非阻塞IO

admin

11月 28, 2021

1.比较

 https://www.zhihu.com/question/274995821

send或者write都是将数据从应用缓冲区复制到内核缓冲区,再由内核根据TCP、IP协议添加报头发送到网络上。

2.recv/send

https://blog.csdn.net/yanbao4070/article/details/79919220

int recv(int sockfd,void *buf,int len,int flags)
int send(int sockfd,void *buf,int len,int flags)

前面的三个参数和read,write相同,第四个参数能够是0或是以下的组合:

  • | MSG_DONTROUTE | 不查找路由表 |
  • | MSG_OOB | 接受或发送带外数据 |
  • | MSG_PEEK | 查看数据,并不从系统缓冲区移走数据 |
  • | MSG_WAITALL | 等待任何数据 |

 如果flags为0,则和read,write一样的操作。

在unix中,所有的设备都可以看成是一个文件,所以我们可以用read来读取socket数据。

3.read/write

https://www.cnblogs.com/tianzeng/p/9347612.html

ssize_t read(int fd, void * buf, size_t count);
ssize_t write (int fd, const void * buf, size_t count); 

write返回值:如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中

  1. write()函数返回值一般无0,只有当如下情况发生时才会返回0:write(fp, p1+len, (strlen(p1)-len)中第三参数为0,此时write()什么也不做,只返回0。
  2. write()函数从buf写数据到fd中时,若buf中数据无法一次性读完,那么第二次读buf中数据时,其读位置指针(也就是第二个参数buf)不会自动移动,需要程序员编程控制,而不是简单的将buf首地址填入第二参数即可。如可按如下格式实现读位置移动:write(fp, p1+len, (strlen(p1)-len)。 这样write第二次循环时变会从p1+len处写数据到fp, 之后的也由此类推,直至(strlen(p1)-len变为0。

send,write返回成功,只表示数据已经copy 到底层缓冲,而不表示数据已经发出,更不能表示对方端口已经接收到数据.

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注