zoukankan      html  css  js  c++  java
  • write/writev/send与阻塞非阻塞IO

    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 到底层缓冲,而不表示数据已经发出,更不能表示对方端口已经接收到数据.

  • 相关阅读:
    learn go memoization
    learn go return fuction
    Java5 并发学习
    Java中的protected访问修饰符
    LinkedBlockingQueue
    BlockingQueue的使用
    Java并发编程:Callable、Future和FutureTask
    Java线程池的工作原理与实现
    SQL Server中Delete语句表名不能用别名
    请问JDBC中IN语句怎么构建
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/15000255.html
Copyright © 2011-2022 走看看